Есть ли свободная библиотека Java, которую я могу использовать для преобразования строки в одной кодировке в другую кодировку, что-то вроде iconv
? Я использую Java версии 1.3.
Преобразование кодировки в java
Ответ 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