Строка в массив символов, возвращающий другой результат в Visual Studio и Android Studio
строка, которую я хочу преобразовать в массив символов, ষ্টোর она находится в юникоде и Бенгальском слове.
проблема в том, когда я преобразую его в Visual studio затем он возвращается 6 символов но когда я преобразовать его в Android Studio затем он показывает 5 символов.
в VS я использую char[] arrayOfChars = someString.ToCharArray(); и в Android Studio char[] arrayOfChars = someString.toCharArray();
N: B: моя IDE Android Studio и кодировка проекта-UTF-8. Я ожидаю того же результата, что и Visual Studio в Android Studio.
2 ответов
эти два массива эквивалент в юникоде, но представлены различными формами нормализации. Кажется, происходит то, что Java ToCharArray
(или строковое представление) использует одну форму нормализации, в то время как C# ToCharArray
(или строковое представление) использует другого.
на этой странице содержит диаграмму различных форм нормализации для бенгальского текста - четвертая строка описывает именно то, что вы видя:
Я только узнаю об этом сейчас, но мне кажется, что мотивация для этого заключается в том, чтобы реализации unicode могли оставаться совместимыми с ранее существующими кодировками, где это возможно и практично.
например, одна ранее существовавшая кодировка может использовать один символ юникода, в то время как другая ранее существовавшая кодировка может вместо этого использовать два символа вместе. Решение, принятое людьми unicode таким образом, чтобы поддержать оба, ценой отсутствия единого "канонического" представления, как вы столкнулись здесь.
Если вы хотите, чтобы Ваш массив Java был нормализован в форме нормализации "D", которую, похоже, использует Ваш массив C#, кажется, что на этой странице предоставляет такую функцию. Вы можете искать что-то вроде:
someString = Normalizer.normalize(someString, Normalizer.Form.NFD);
Unicode стандартное приложение 15 является официальным документом, который описывает эти формы нормализации.
вы должны были ввести строку по-другому.
текст ষ্টোর
- это кодовые точки Unicode 09B7 09CD 099F 09CB 09B0
, то есть 2487 2509 2463 2507 2480
, Как показывает ваш C#.
значения, показанные Java, т. е. 2487 2509 2463 2503 2494 2480
, присвоен 4-й символ 2507
/ 09CB
как два символа 2503 2494
/ 09C7 09BE
.
глядя на них, они:
ো ↔ ' БЕНГАЛЬСКИЙ ГЛАСНЫЙ ЗНАК O '(U+09CB)
и
ে ↔ 'БЕНГАЛЬСКИЙ ГЛАСНЫЙ ЗНАК E '(U+09C7)
↔ া 'БЕНГАЛЬСКИЙ ГЛАСНЫЙ ЗНАК AA' (U+09BE)
который в сочетании выходит к тому же:
↔ ষ্টোর 09B7 09CD 099F 09CB 09B0
↔ ষ্টোর 09B7 09CD 099F 09C7 09BE 09B0
они сочетания символов, и есть разные способы объединить символы, чтобы получить тот же результат.