Преобразование кодировки в java

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

Ответ 1

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

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

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

Ответ 2

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

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

См. Charset. Это не означает, что UTF16 - это кодировка по умолчанию (т.е.: По умолчанию) между последовательностями шестнадцатиразрядных Unicode code units и последовательности байтов "):

Каждый экземпляр виртуальной машины 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) {
}

Ответ 3

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

Этот ответ в другом вопросе дает объяснение, почему преобразование не всегда дает правильные результаты fooobar.com/questions/20688/...

Ответ 4

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

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

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

Ответ 5

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

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

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

Источник с помощью stackoverflow