Двухбайтовый символ в Java

Код ниже будет печатать длину хранилища байтов ниже строки, которая содержит двухбайтовый японский символ. Насколько я понимаю, вывод этой программы должен быть 2, однако он приходит как 3. Почему это так?

String j = "大";     
System.out.println(j.getBytes().length);

Если это будет всегда так, то я должен предположить ниже:

1, для однобайтового символа вывод программы всегда будет 1

2, для двухбайтового символа вывод программы всегда будет 3


person Raj    schedule 07.04.2014    source источник
comment
UTF 8 хранит юникод до 4 байтов: en.wikipedia.org/wiki/UTF8   -  person Justin    schedule 07.04.2014
comment
Спасибо, что дали мне знать . поэтому я должен предположить, что символ ASCII будет использовать только один байт, т.е. вывод вышеуказанной программы всегда будет 1 для символа ASCII?   -  person Raj    schedule 07.04.2014
comment
Взгляните на ideone.com/siF2OW . Да, символ ASCII будет использовать только один байт.   -  person Justin    schedule 07.04.2014


Ответы (3)


Длина байта 8 символов UTF может составлять от 1 до 4 байтов. Таким образом, ваш код печатает любую правильную длину байта для входного японского символа.

person Juned Ahsan    schedule 07.04.2014

Я полагаю, что кодовая точка для этого символа — 0x5927, которая при представлении в формате UTF-8 представляет собой три байта E5 A4 A7. (Не все символы, отличные от ASCII, занимают 3 байта в UTF-8, только символы с кодовыми точками в диапазоне от 0x0800 до 0xFFFF.)

person Turix    schedule 07.04.2014

Метод .getBytes() использует системную кодировку по умолчанию (в случае Linux это обычно UTF-8).

Поскольку вы упомянули «однобайтовые» и «двухбайтовые японские символы», я думаю, вы хотите использовать кодировку SJIS. Вы делаете это следующим образом:

String j = "大";     
System.out.println(j.getBytes("SJIS").length);

печатает 2.

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

person Karol S    schedule 07.04.2014