Преобразование кодировки в Java
-
04-07-2019 - |
Вопрос
Есть ли какая-нибудь бесплатная библиотека 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
akaISO-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