Двубайтов знак в 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 char ще използва само един байт, т.е. изходът на горната програма винаги ще бъде 1 за ASCII charcater?   -  person Raj    schedule 07.04.2014
comment
Разгледайте ideone.com/siF2OW. Да, ASCII символ ще използва само един байт.   -  person Justin    schedule 07.04.2014


Отговори (3)


Дължината на UTF байта от 8 знака може да бъде между 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