Библиотеки Java для преобразования между кодировками символов - PullRequest
0 голосов
/ 14 декабря 2010

Проблема, которую я хочу решить, заключается в конвертации между типами хранения Unicode.Насколько я понимаю, один символ в UTF-8 может быть представлен от 1 до 4 байтов данных, тогда как символ в UTF-16 может быть представлен в 1-2-байтовых блоках данных.Эта переменная длина означает, что трудно конвертировать между ними и создавать что-то разумное в английском языке.

Я ищу библиотеку, которая позволила бы мне указать язык или локаль, а также механизм хранения (utf-8 и т. Д.) И позволила бы получить более разумный результат.Я сплю в облаках?

Ответы [ 4 ]

3 голосов
/ 14 декабря 2010

Не достаточно String.getBytes(String charsetname)?

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#getBytes(java.lang.String)

Позволяет получить необработанные байты строки в определенной кодировке.

String имеет [constructor] [2], который также будет принимать байтовый массив и имя кодировки, так что вы можете использовать это для декодирования.

[2]: http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#String(byte[], java.lang.String)

2 голосов
/ 14 декабря 2010

Это разумно для многих наборов символов.Есть еще несколько, которые не могут вписаться в Юникод, но не много.

Сначала помните, что байты не являются символами, для работы с символами вам необходимо преобразовать их, и, как правило, самый простой способ сделать этообернуть поток байтов в считыватель (или записывающее устройство), созданный с соответствующим набором кодирования / декодирования.

Для списка непосредственно поддерживаемых кодировок вот что поставляется с JVM .

Ключ не в том, чтобы использовать устройства чтения и записи по умолчанию, так как они используют кодировку платформы.Вместо этого выберите одну кодировку.UTF-8 хорош по размеру диска, плох по производительности кодирования / декодирования;в то время как UTF-32 ужасен по размеру диска и превосходен по производительности кодирования / декодирования.UTF-16 - это что-то вроде компромисса.Все кодировки на основе UTF оптимизированы для более эффективной обработки символов ASCII, поэтому UTF-8 может превзойти UTF-16, если вы имеете дело только с ASCII.

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

Один способ прочитать поток байтов какInputStream с вашим собственным указанным набором символов должен использовать InputStreamReader, созданный с альтернативным набором символов .Точно так же вам нужно использовать OutputStreamWriter, созданный с альтернативным набором символов.

Все файлы, которыми вы не управляете напрямую, должны использовать набор символов платформы (так как это, вероятно, так и будет) и преобразовываться ввыбор набора символов при сохранении или вводе в программу.

2 голосов
/ 14 декабря 2010

Вы можете преобразовать байты в одной кодировке в строку Java через конструктор String (byte [], Charset).Поддерживаемые наборы символов перечислены в java.nio.charset.Charset .

Затем вы можете преобразовать обратно в байты с другой кодировкой с помощью String.getBytes(CharSet).

Например:

byte[] bytesIn = ...;
String s = new String( bytesIn, Charset.forName( "UTF-8" );
byte[] bytesOut = s.getBytes( Charset.forName( "UTF-16" ))
1 голос
/ 14 декабря 2010

Вы имеете в виду java.io.Reader / Writer или java.nio.charset ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...