Строковый массив символов, возвращающий разные результаты в Visual Studio и Android Studio

Строка, которую я хочу преобразовать в массив символов, это ষ্টোর это в Юникоде и бенгальском слове.

Проблема заключается в том, что я конвертирую его в Visual studio, тогда он возвращает 6 символов, но когда я конвертирую его в Android Studio то он показывает 5 символов.

В VS я использую char [] arrayOfChars = someString.ToCharArray(); и в Android Studio char [] arrayOfChars = someString.toCharArray();

Информация об отладке Visual Studio

Информация об отладке Android Studio

N: B: Моя Android Studio IDE и кодирование проекта - UTF-8. Я ожидаю такой же результат, как Visual Studio в Android Studio.

Ответы

Ответ 1

Эти два массива unicode эквивалент, но представлены различными формами нормализации. Похоже, что Java ToCharArray (или строковое представление) использует одну форму нормализации, а С# ToCharArray (или строковое представление) использует другой.

Эта страница содержит диаграмму различных форм нормализации для текста бенгали - четвертая строка описывает то, что вы видите:

Бенгальская таблица

Сейчас я только об этом узнаю, но мне кажется, что мотивация для этого заключается в том, что реализации unicode могут оставаться совместимыми с существующими кодировками, где это возможно и практично.

Например, одна ранее существовавшая кодировка могла использовать один символ Юникода, тогда как другая ранее существовавшая кодировка могла вместо этого использовать два символа в сочетании. Таким образом, решение, разрешенное юникодными людьми, должно поддерживать обе, за счет отсутствия единого "канонического" представления, как вы здесь встречались.

Если вы хотите, чтобы ваш Java-массив был нормализован в форме нормализации "D", которую, похоже, использует ваш массив С#, кажется, что this page предоставляет такую ​​функцию. Возможно, вы ищете что-то вроде:

someString = Normalizer.normalize(someString, Normalizer.Form.NFD);

Стандартное приложение Unicode 15 является официальным документом, который описывает эти формы нормализации.

Ответ 2

Вы должны ввести строку по-разному.

Текст ষ্টোর - это кодовые точки Юникода 09B7 09CD 099F 09CB 09B0, т.е. 2487 2509 2463 2507 2480, как показывает ваш С#.

Значения, показанные Java, т.е. 2487 2509 2463 2503 2494 2480, имеют 4-й символ 2507/09CB как два символа 2503 2494/09C7 09BE.

Взглянув на них, они:

ো ↔ 'BENGALI VOWEL SIGN O' (U + 09CB)

против.

ে ↔ 'BENGALI VOWEL SIGN E' (U + 09C7)
া ↔ 'BENGALI VOWEL SIGN AA' (U + 09BE)

которые в совокупности выходят на одно и то же:

ষ্টোর ↔ 09B7 09CD 099F 09CB 09B0
ষ্ট ো র ↔ 09B7 09CD 099F 09C7 09BE 09B0

Они объединяют символы, и есть разные способы комбинировать символы, чтобы получить тот же результат.