В какой кодировке хранится Java char?

гарантируется ли сохранение типа Java char в любой конкретной кодировке?

Edit: я неправильно сформулировал этот вопрос. Что я хотел спросить гарантированы ли литералы char для использования какой-либо конкретной кодировки?

3 ответов


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

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


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

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

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

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

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


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

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


FOLLOWUP

а как насчет char literals? Например, " c " должно иметь некоторое значение, определенное языком.

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

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


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