Каково внутреннее представление Java для String? Модифицированный UTF-8? UTF-16? - PullRequest
46 голосов
/ 14 марта 2012

Я искал внутреннее представление Java для String, но у меня есть два материала, которые выглядят надежными, но несовместимыми.

Один из них:

http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451

и там написано:

Java использует UTF-16 для внутреннего текстового представления и поддерживает нестандартную модификацию UTF-8 для сериализации строк.

Другой:

http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8

и там написано:

Tcl также использует тот же модифицированный UTF-8 [25], что и Java, для внутреннего представления данных Unicode, но использует строгий CESU-8 для внешних данных.

Модифицированный UTF-8? Или UTF-16? Который правильный? А сколько байтов Java использует для символа в памяти?

Пожалуйста, дайте мне знать, какой из них правильный и сколько байтов он использует.

Ответы [ 6 ]

58 голосов
/ 14 марта 2012

Java использует UTF-16 для внутреннего текстового представления

Представление для String, StringBuilder и т. Д. В Java - UTF-16

https://docs.oracle.com/javase/8/docs/technotes/guides/intl/overview.html

Как текст представлен на платформе Java?

Язык программирования Java основан на наборе символов Unicode, и несколько библиотек реализуют стандарт Unicode. Примитивный тип данных char в языке программирования Java представляет собой 16-разрядное целое число без знака, которое может представлять кодовую точку Unicode в диапазоне от U + 0000 до U + FFFF или кодовые единицы UTF-16. Различные типы и классы в платформе Java, которые представляют последовательности символов - char [], реализации java.lang.CharSequence (такие как класс String) и реализации java.text.CharacterIterator - являются последовательностями UTF-16.

На уровне JVM, если вы используете -XX:+UseCompressedStrings (который используется по умолчанию для некоторых обновлений Java 6). Фактическое представление в памяти может быть 8-разрядным, ISO-8859-1, но только для строк, которые не нужна кодировка UTF-16.

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

и поддерживает нестандартную модификацию UTF-8 для сериализации строк.

Сериализованные строки по умолчанию используют UTF-8.

А сколько байтов Java использует для символа в памяти?

A char - это всегда два байта, если вы игнорируете необходимость заполнения в Object.

Примечание: кодовая точка (которая допускает символ> 65535) может использовать один или два символа, то есть 2 или 4 байта.

18 голосов
/ 14 марта 2012

До Java 9 стандартное представление в памяти для Java String - это кодовые единицы UTF-16, хранящиеся в char[].Модифицированный UTF-8 используется в других контекстах;например, в файлах ".class" и в формате сериализации объектов.

В этом можно убедиться, посмотрев исходный код класса java.lang.String.

С Java 6, обновление 21 и новее, была нестандартная опция (-XX:UseCompressedStrings) для включения сжатых строк.Эта функция была удалена в Java 7.

Для Java 9 и более поздних версий было изменено поведение, если String для использования компактного представления для строк по умолчанию ,Команда java Документация теперь говорит следующее:

-XX: -CompactStrings

Отключает функцию Compact Strings. По умолчанию этот параметр включен. Когда этот параметр включен, строки Java, содержащие только однобайтовые символы, представляются внутри и сохраняются как строки, состоящие из одного байта на символ, с использованием ISO-8859-1 / Latin-1 кодировка.Это уменьшает на 50% объем пространства, необходимого для строк, содержащих только однобайтовые символы.Для строк Java, содержащих как минимум один многобайтовый символ: они представлены и хранятся в виде 2 байтов на символ с использованием кодировки UTF-16.Отключение функции Compact Strings заставляет использовать кодировку UTF-16 в качестве внутреннего представления для всех строк Java.

Обратите внимание, что ни «сжатые», ни «компактные» строки не используют / используют кодировку UTF-8.

См. Также:

12 голосов
/ 14 марта 2012

UTF-16.

С http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp:

Как текст представлен на платформе Java?

Язык программирования Java основан на наборе символов Unicode, и несколько библиотек реализуют стандарт Unicode. Примитив тип данных char в языке программирования Java - 16-разрядный без знака целое число, которое может представлять кодовую точку Unicode в диапазоне от U + 0000 до U + FFFF или кодовые единицы UTF-16. Различные типы и классы в платформа Java, представляющая последовательности символов - char [], реализации java.lang.CharSequence (например, класс String), и реализации java.text.CharacterIterator - это UTF-16 последовательности.

3 голосов
/ 14 марта 2012

Размер char составляет 2 байта.

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

0 голосов
/ 14 марта 2012

java доступен на 18 международных языках и после набора символов UNICODE, который содержит все символы, доступные на 18 международных языках и содержит 65536 символов. И java, следующий за UTF-16, поэтому размер символа в java составляет 2 байта.

0 голосов
/ 14 марта 2012

Java хранит строки внутри себя как UTF-16 и использует 2 байта для каждого символа.

...