2010-12-15 3 views
33

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

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

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

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

+0

Вы должны рассмотреть возможность их разбиения на отдельные вопросы, так как они действительно очень разные. # 2, вероятно, можно ответить здесь: http://stackoverflow.com/questions/1490218/utf-16-to-ascii-conversion-in-java – 2010-12-15 18:05:48

ответ

15

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

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

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

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

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

ДОПОЛНЕНИЕ 2
Случай, один символ представляет символ один Unicode только верно в большинстве случаев. Это означало бы кодирование UCS-2 до 2005 года. Но теперь Unicode стал больше, а строки должны быть закодированы с использованием UTF-16, где, увы, один символ Unicode может использовать дваchar s на Java String.

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

29
  1. Java хранит строки как UTF-16 внутри.

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

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

  3. От java.lang.Character docs:

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

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

+0

Использование массивов char и char определяется только для общедоступного внешнего API для String и StringBuffer. Внутренняя память символов специфична для реализации. – jarnbjo 2010-12-15 20:24:08

+0

@jarnbjo Вышеприведенная прямая цитата из документов. Тип данных `char` в Java представляет собой единицу кода UTF-16 (не символ, акокодекод Unicode), поэтому я думаю, что вполне можно сказать, что Java - это представление текста языка UTF-16. Да, возможно, реализация могла бы сделать что-то другое под обложками, но в конце концов им пришлось бы выглядеть так, как будто они использовали UTF-16. – 2010-12-16 00:33:50

+0

Поскольку доступ к внутреннему хранилищу классов String и StringBuffer невозможен, возникает смысл предположить, что к нему относится заявление, которое вы указываете. – jarnbjo 2010-12-16 09:41:03

1

Edit: благодаря LoadMaster за помощь мне корректируя мой ответ :)

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

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

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

Смежные вопросы