В какой кодировке хранится символ Java? - PullRequest
10 голосов
/ 11 августа 2011

Гарантируется ли тип символа Java для хранения в какой-либо конкретной кодировке?

Редактировать: Я неправильно сформулировал этот вопрос.То, что я хотел спросить, это ли литеральные символы гарантированно использовать какую-либо конкретную кодировку?

Ответы [ 3 ]

16 голосов
/ 11 августа 2011

"Хранится" где?Все строки в Java представлены в UTF-16 .При записи в файл, отправке по сети или как-то еще, он отправляется с использованием любой кодировки, которую вы укажете.

Редактировать: Специально для типа char см. Документы персонажа .В частности: «Тип данных char ... основан на исходной спецификации Unicode, в которой символы определены как 16-битные объекты фиксированной ширины».Поэтому приведение char к int всегда даст вам значение UTF-16 , если char на самом деле содержит символ из этой кодировки.Если вы просто вставили какое-то случайное значение в char, это, очевидно, не обязательно будет действительный символ UTF-16, и аналогично, если вы читаете этот символ в плохой кодировке.Далее в документах обсуждается, как дополнительные символы UTF-16 могут быть представлены только int, поскольку char не имеет достаточно места для их хранения, и если вы работаете на этом уровне, это может бытьважно ознакомиться с этой семантикой.

6 голосов
/ 11 августа 2011

Java char традиционно используется для хранения единицы кода Unicode ;то есть 16-битная единица, которая является частью действительной последовательности UTF-16.Однако ничто не мешает приложению помещать любое 16-битное значение без знака в char, независимо от того, что оно на самом деле означает.

Таким образом, можно сказать, что единица кода Unicode может быть , представленный char и char , может представлять единицу кода Unicode ... но ни один из них не является обязательно истинным, в общем случае.

На ваш вопрос о том, как хранится Java char, ответить невозможно.Проще говоря, это зависит от того, что вы подразумеваете под «сохраненным»:

  • Если вы имеете в виду «представленный в исполняемой программе», то ответ зависит от реализации JVM.(Тип данных char обычно представляется как 16-разрядное машинное целое число, хотя оно может быть или не быть выровненным по машинному слову, в зависимости от конкретного контекста.)

  • Если вы имеете в виду«хранится в файле» или что-то в этом роде, тогда ответ полностью зависит от того, как приложение решит его сохранить.


Гарантируется ли тип символов Java в какой-либо конкретной кодировке?

В свете сказанного выше ответ «Нет».В исполняемом приложении только приложение решает, что означает / содержит char.Когда char сохраняется в файле, приложение решает, как оно хочет сохранить его и какое представление на диске оно будет использовать.


FOLLOWUP

А как насчет букв литералов?Например, «c» должен иметь какое-то значение, определенное языком.

Это зависит от литеральной формы символа и от того, что символ.Например, 'c' будет иметь значение нижних 16 битов кодовой точки Unicode для строчной буквы 'c'.Но литерал, выраженный как «\ uxxxx», может не представлять действительный код Unicode.Или (в зависимости от того, что означает приложение), оно может вообще не представлять символ.

Это также (потенциально) осложняется кодированием файла исходного кода.Теоретически возможно представить ваш исходный код в пользовательской кодировке символов, в которой (ради аргумента) заглавные буквы кодируются как строчные, и наоборот.Если вы сделали это, и вы смогли зарегистрировать соответствующий кодер и декодер Charset перед запуском компилятора, тогда литерал, который выглядит как 'c' (при просмотре ввода в формате ASCII или UTF-8), на самом деле будет иметь значение 67в программе компилятора, а не 99.

2 голосов
/ 11 августа 2011

Первоначально Java использовала UCS-2 для внутренних нужд;теперь он использует UTF-16.Они практически идентичны, за исключением D800 - DFFF, которые используются в UTF-16 как часть расширенного представления для больших символов.

...