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
.