Я пытаюсь преобразовать строку Java, содержащую символ Unicode в плане CJK ExtB, в десятичные NCR.
Например (вы можете попробовать это с http://people.w3.org/rishida/tools/conversion/):
- "游 鍚 堃" следует преобразовать в
游鍚堃
- "? 懷" следует преобразовать в
𧦧懷
Вот что я пытался (в Scala):
def charToHex(char: Char) = "&#%d;" format(char.toInt)
def stringToHex (string: String) = string.flatMap(charToHex)
println (stringToHex("游鍚堃")) // 游鍚堃
println (stringToHex("?懷")) // ��懷
println ("?懷".toCharArray().length) // Why it is 3?
Как видите, в первом случае он корректно преобразует три символа Юникод в три NCR.
Но во втором случае «? 懷» есть только два символа Юникода, но Java / Scala, похоже, считает, что это строка, содержащая три символа.
Итак, что здесь происходити как я могу преобразовать второй случай правильно, как конвертер на сайте, который я упомянул?Большое спасибо.
Обновление:
- Мой файл исходного кода использует UTF-8.
- Вот результат "? 懷" .toCharArray ()
char[] = ?, char.toInt = 55390
char[] = ?, char.toInt = 56743
char[] = 懷, char.toInt = 25079
Теперь я думаю, что знаю, что произошло.Символ «?» кодируется как 0xD85E 0xDDA7 в UTF-16, что составляет 4 байта вместо 2 байтов.Таким образом, при преобразовании в массив char требуется 2 элемента, где тип данных char
может представлять только 2 байта.