2014-01-14 2 views
3

В java doc утверждает это:размер полукокса в виде массива байтов

символ: Тип символ данных представляет собой одну 16-битный символ Юникода. Он имеет минимальное значение '\ u0000' (или 0) и максимальное значение '\ uffff' (или 65535 включительно).

Но когда у меня есть строки (только содержащий ASCII-знаки) и преобразовать его в массив байтов, каждый знак строки хранится в один байт, что меньше, чем 16 бит, как ява документы утверждает его , Как это работает? Я мог представить себе, что java-компилятор/интерпретатор использует только один байт на символ для знака ASCII для проблем с производительностью.

Кроме того, что произойдет, если у меня есть строка со знаками ASCII и одним знаком UTF-16 и преобразует их в массив байтов. Каждый знак String теперь использует 2 байта?

+0

Как вы его «конвертировали»? – keshlam

+0

Что такое знак ASCII? –

+0

http://stackoverflow.com/questions/2164804/from-compilation-to-runtime-how-does-java-string-encoding-really-work –

ответ

4

Преобразование символов в байты и наоборот осуществляется с использованием character encoding.

Кодировка символов определяет, как символы представлены байтами. Например, ASCII является кодировкой символов, которая использует 7 бит на символ. Очевидно, что он может содержать только 128 символов, что меньше, чем 65 536 символов, существующих на Java.

Другие кодировки символов - UTF-8 и UTF-16. Фактически, Java char на самом деле является символом UTF-16 - если вы прямо передали его в int, вы получите код UTF-16 для символа.

Вот более длинный учебник по кодировке символов: What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text.

Если вы позвоните по номеру getBytes() по номеру String, он будет использовать кодировку символов по умолчанию для преобразования символов в строку в байты. Лучше использовать версию getBytes(), которая берет имя набора символов в качестве аргумента, чтобы вы знали, какой набор символов используется. Например: по умолчанию кодировка

byte[] bytes = str.getBytes("UTF-8"); 
2

Внутренний формат строки использует 16 бит на символ. Когда вы конвертируете его в массив байтов, вы используете определенную кодировку символов, которая либо явно указана, либо стандартная кодировка платформы. Кодировка может использовать меньшее количество бит на символ.

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

Другой часто используемой кодировкой является UTF-8, который использует переменное количество байтов на символ. Первые 128 символов (соответствующие символам, доступным в ASCII) могут храниться по одному байту каждый. Для символов с порядковыми номерами 128 или выше требуется два или более байта.

+0

, но вопрос имеет смысл: что, если строка имеет много разных символов (более 256 разных символов), и вы конвертируете их в массив байтов, будет ли она по-прежнему иметь размер строки? если да, то как вы могли бы преобразовать их назад, так как каждый байт содержит только до 256 символов ... Надеюсь, это означает, что длина массива байтов будет в два раза больше количества символов в строке. –

+0

@androiddeveloper no, UTF-8 - кодирование с переменной длиной. Если старший бит в байте равен 0, это символ одного байта, если старший бит равен 1, символ представлен в более чем одном байте. Нет простого способа получить длину строки из длины массива байтов. Вам нужно посмотреть на каждый байт. – Henry

+0

, но это то, что я написал - вы, вероятно, получите двойной байт, нет? или только для некоторых персонажей? вопрос в том, как вы конвертируете в строку обратно. никогда не пробовал это раньше. –

1

getBytes() Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.

вашей платформы, вероятно UTF8. Следовательно, getBytes() будет использовать один байт на символ для символов, которые удобно вписываются в этот размер.

1

«кодирует эту строку в последовательность байтов с использованием кодировки по умолчанию платформы, сохраняя результат в новый массив байтов». По умолчанию кодировка платформы (Charset.defaultCharset()) - это UTF-8.

Что касается второго вопроса, то для использования UTF-16 на самом деле не требуется нить. То, как JVM хранит строки внутри, не имеет значения. Несколько вхождений UTF-16 в спецификации JVM применяются только к char.

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