Вопрос

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

Это было полезно?

Решение

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

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

Видеть "Кодировка URL-адреса (или:«Что это такое»%20" коды в URL-адресах?')".

Другие советы

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

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

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

  

Каждый экземпляр виртуальной машины Java имеет набор символов по умолчанию, который может быть или не быть одним из стандартных наборов символов.
  [ US-ASCII , ISO-8859-1 aka ISO-LATIN-1 , UTF-8 , < code> 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) {
}

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

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

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

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

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

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

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

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

Source by stackoverflow

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top