Подтвердить что ты не робот

Что такое внутреннее представление 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 в памяти?

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

4b9b3361

Ответ 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 байта.