Что такое внутреннее представление Java для String? Изменен UTF-8? UTF-16?
Я искал внутреннее представление 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 для char в памяти?
Пожалуйста, дайте мне знать, какой из них правильный, и сколько байтов оно использует.
Ответы
Ответ 1
Java использует UTF-16 для внутреннего текстового представления
Представление для String и StringBuilder и т.д. В Java - UTF-16
https://docs.oracle.com/javase/8/docs/technotes/guides/intl/overview.html
Как представлен текст на платформе Java?
Язык программирования Java основан на наборе символов Unicode, а несколько библиотек реализуют стандарт Unicode. Символом примитивного типа данных на языке программирования 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 для символа в памяти?
char
всегда имеет два байта, если вы игнорируете необходимость заполнения в объекте.
Примечание. Кодовая точка (которая позволяет символу> 65535) может использовать один или два символа, то есть 2 или 4 байта.
Ответ 2
До Java 9 стандартное представление в памяти, используемое в Java String
- это кодовые единицы UTF-16, хранящиеся в char[]
. Модифицированный UTF-8 используется в других контекстах; например, в файлах ".class" и формате сериализации объекта.
Вы можете подтвердить это, посмотрев исходный код класса java.lang.String
.
С обновлением версии Java 6 21 и более поздних -XX:UseCompressedStrings
нестандартная опция (-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.
Смотрите также:
Ответ 3
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 последовательности.
Ответ 4
Размер a char
равен 2 байтам.
Поэтому я бы сказал, что Java использует UTF-16 для внутреннего представления String.
Ответ 5
Java хранит строки внутри UTF-16 и использует 2 байта для каждого символа.
Ответ 6
java доступен на 18 международных языках и после набора символов UNICODE, который содержит все символы, которые доступны на 18 международных языках и
содержит 65536 символов. И java после UTF-16, поэтому размер char в java составляет 2 байта.