Кодировка преобразования в Java - PullRequest
30 голосов
/ 23 октября 2008

Существует ли какая-либо бесплатная библиотека java, которую я могу использовать для преобразования строки в одной кодировке в другую кодировку, например, iconv? Я использую Java версии 1.3.

Ответы [ 5 ]

41 голосов
/ 23 октября 2008

Вам не нужна библиотека, кроме стандартной - просто используйте Charset . (Вы можете просто использовать конструкторы String и методы getBytes, но лично мне не нравится работать только с именами кодировок символов. Слишком много места для опечаток.) ​​

РЕДАКТИРОВАТЬ: Как указано в комментариях, вы все еще можете использовать экземпляры Charset, но при этом легко использовать методы String: new String (bytes, charset) и String.getBytes (charset) ) .

См. " Кодировка URL (или:" Что это за "%20" коды в URL? ") ".

19 голосов
/ 23 октября 2008

CharsetDecoder должно быть то, что вы ищете, нет?

Многие сетевые протоколы и файлы хранят свои символы с байтово-ориентированным набором символов, таким как ISO-8859-1 (ISO-Latin-1).
Тем не менее, собственная кодировка символов Java Unicode UTF16BE (16-битный формат преобразования UCS, порядок байтов с прямым порядком байтов).

См. Charset. Это не означает, что UTF16 является набором символов по умолчанию (т. Е. «Отображением по умолчанию между последовательностями шестнадцати битов единиц кода Unicode и последовательностями байтов»):

Каждый экземпляр виртуальной машины Java имеет набор символов по умолчанию, который может быть или не быть одним из стандартных наборов символов.
[US-ASCII, ISO-8859-1 a.k.a. ISO-LATIN-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16]
Набор символов по умолчанию определяется во время запуска виртуальной машины и обычно зависит от локали и набора символов, используемых базовой операционной системой.

В этом примере показано, как преобразовать ISO-8859-1 байтов в ByteBuffer в строку в CharBuffer и наоборот.

// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();

try {
    // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
    // The new ByteBuffer is ready to be read.
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));

    // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
    // The new ByteBuffer is ready to be read.
    CharBuffer cbuf = decoder.decode(bbuf);
    String s = cbuf.toString();
} catch (CharacterCodingException e) {
}
2 голосов
/ 02 сентября 2015

Я просто хотел бы добавить, что если строка String изначально закодирована с использованием неправильной кодировки, может быть невозможно изменить ее на другую кодировку без ошибок. В вопросе не говорится, что преобразование здесь сделано из неправильной кодировки в правильную кодировку, но я лично наткнулся на этот вопрос только из-за этой ситуации, поэтому просто хедз-ап для других.

Этот ответ на другой вопрос дает объяснение, почему преобразование не всегда дает правильные результаты. https://stackoverflow.com/a/2623793/4702806

0 голосов
/ 27 марта 2014

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

Я не знаю много о ISO-8859-2, но я не удивлюсь, если почти каждый файл является допустимым текстовым файлом в этой кодировке. Лучшее, что вы сможете сделать, - это проверить это эвристически. Действительно, на странице Википедии, где говорится об этом, можно предположить, что только байт 0x7f недопустим.

Нет идеи прочитать файл «как есть» и получить текст - файл представляет собой последовательность байтов, поэтому вам необходимо применить кодировку символов для декодирования этих байтов в символы.

Источник от stackoverflow

0 голосов
/ 29 августа 2009

Намного проще, если вы думаете о юникоде как о наборе символов (который на самом деле является - это в основном нумерованный набор всех известных символов). Вы можете кодировать его как UTF-8 (1-3 байта на символ в зависимости от) или, возможно, UTF-16 (2 байта на символ или 4 байта с использованием суррогатных пар).

В далеком прошлом Java использовала UCS-2 для кодирования набора символов Юникода. Это может обрабатывать только 2 байта на символ и теперь устарело. Было довольно очевидно взломать добавление суррогатных пар и перейти на UTF-16.

Многие люди думают, что им следовало использовать UTF-8. Когда Java была изначально написана, Юникод в любом случае имел более 65535 символов ...

...