Что такое кодировка символов String в Java? - PullRequest
44 голосов
/ 15 декабря 2010

Я на самом деле запутался в отношении кодирования строк в Java.У меня есть пара вопросов.Пожалуйста, помогите мне, если вы знаете ответ на них:

1) Какова собственная кодировка строк Java в памяти?Когда я пишу String a = "Hello", в каком формате он будет сохранен?Поскольку Java не зависит от машины, я не думаю, что система будет выполнять кодировку.

2) Я прочитал в сети, что "UTF-16" является кодировкой по умолчанию, но я запутался, потому что когда я пишуint a = 'c' Я получаю номер символа в таблице ASCII.Так ASCII и UTF-16 одинаковы?

3) Также я не был уверен, от чего зависит хранение строки в памяти: ОС, язык?

Ответы [ 4 ]

36 голосов
/ 15 декабря 2010
  1. Java хранит строки как UTF-16 внутри.

  2. «кодировка по умолчанию» не совсем правильная. Java хранит строки как UTF-16 внутри, но внешняя кодировка, «системная кодировка по умолчанию», варьируется от платформы к платформе и может даже изменяться такими вещами, как переменные среды на некоторых платформах.

    ASCII - это подмножество латинского 1, которое является подмножеством Unicode. UTF-16 - это способ кодирования Unicode. Поэтому, если вы выполните тест int i = 'x' для любого символа, попадающего в диапазон ASCII, вы получите значение ASCII. Однако UTF-16 может представлять намного больше символов, чем ASCII.

  3. Из java.lang.Character docs :

    Платформа Java 2 использует представление UTF-16 в массивах символов и в классах String и StringBuffer.

    Таким образом, в рамках платформы Java 2 определено, что для этих классов используется UTF-16.

19 голосов
/ 15 декабря 2010

1) Строки - это объекты, которые обычно содержат массив char и длину строк. Массив символов обычно реализуется как непрерывный массив из 16-разрядных слов, каждое из которых содержит символ Unicode в собственном порядке байтов.

2) Присвоение значения символа целому числу преобразует 16-битный код символа Unicode в его целочисленный эквивалент. Таким образом, 'c', то есть U + 0063, становится 0x0063 или 99.

3) Поскольку каждый String является объектом, он содержит другую информацию, нежели члены его класса (например, слово дескриптора класса, слово блокировки / семафора и т. Д.).

ADENDUM
Содержимое объекта зависит от реализации JVM (которая определяет внутреннюю нагрузку, связанную с каждым объектом) и от того, как класс фактически закодирован (то есть некоторые библиотеки могут быть более эффективными, чем другие).

Пример
Типичная реализация выделяет служебную информацию из двух слов на экземпляр объекта (для дескриптора / указателя класса и управляющего слова семафора / блокировки); объект String также содержит длину int и ссылку на массив char[]. Фактическое символьное содержимое строки хранится во втором объекте, массиве char[], которому, в свою очередь, выделяется два слова плюс слово длины массива плюс столько 16-битных элементов char, сколько необходимо для строки ( плюс любые дополнительные символы, которые оставались бездействующими при создании строки).

ADDENDUM 2
Случай, когда one char представляет one Unicode-символ, верен только в большинстве случаев. Это подразумевало бы кодирование UCS-2 и значение true до 2005 года. Но к настоящему времени Unicode стал больше и строки должны кодироваться с использованием UTF-16 - где, увы, один символ Unicode может использовать two char с в Java String.

Взгляните на фактический исходный код для реализации Apache, например, в:
http://www.docjar.com/html/api/java/lang/String.java.html

4 голосов
/ 15 декабря 2010

Хотя это не отвечает на ваш вопрос, стоит отметить, что ... В байт-коде Java (файл класса) строка хранится в UTF-8. http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

1 голос
/ 15 декабря 2010

Редактировать: спасибо LoadMaster за помощь в исправлении моего ответа:)

1) Вся внутренняя обработка строк выполнена в UTF-16.

2) ASCII является подмножеством UTF-16.

3) Внутренне в Java есть UTF-16. В остальном, это зависит от того, где вы находитесь, да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...