Как конвертировать между ISO-8859-1 и UTF-8 в Java?
кто-нибудь знает, как преобразовать строку из ISO-8859-1 в UTF-8 и обратно в Java?
Я получаю строку из интернета и сохраняю ее в RMS (J2ME), но я хочу сохранить специальные символы и получить строку из RMS, но с кодировкой ISO-8859-1. Как мне это сделать?
5 ответов
В общем, вы не можете этого сделать. UTF-8 способен кодировать любую кодовую точку Юникода. ISO-8859-1 может обрабатывать только крошечную часть из них. Таким образом, перекодирование с ISO-8859-1 на UTF-8 не является проблемой. Переход от UTF-8 к ISO-8859-1 приведет к появлению в тексте "заменяющих символов" (�) при обнаружении неподдерживаемых символов.
для перекодирования текста:
byte[] latin1 = ...
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");
или
byte[] utf8 = ...
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");
вы можете осуществлять больший контроль, используя нижний уровень Charset
API-интерфейсы. Например, можно создать исключение при обнаружении некодируемого символа или использовать другой символ для замены текста.
что сработало для меня: ("üzüm bağları" правильно написано на турецком языке)
перевести единицы: ISO-8859-1 в UTF-8:
String encodedWithISO88591 = "üzüm baÄları";
String decodedToUTF8 = new String(encodedWithISO88591.getBytes("ISO-8859-1"), "UTF-8");
//Result, decodedToUTF8 --> "üzüm bağları"
перевести единицы: UTF-8 в ISO-8859-1
String encodedWithUTF8 = "üzüm bağları";
String decodedToISO88591 = new String(encodedWithUTF8.getBytes("UTF-8"), "ISO-8859-1");
//Result, decodedToISO88591 --> "üzüm baÄları"
если у вас String
, вы можете сделать это:
String s = "test";
try {
s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
если у вас "битые"String
, вы сделали что-то неправильно, преобразовав String
до String
в другой кодировке defenetely не путь! Вы можете преобразовать String
до byte[]
и наоборот (учитывая кодировку). В Java String
S кодируются AFAIK с UTF-16
но это деталь реализации.
скажите, что у вас есть InputStream
, вы можете прочитать в byte[]
а затем преобразовать это в String
используя
byte[] bs = ...;
String s;
try {
s = new String(bs, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
или даже лучше (благодаря Эриксону) использовать InputStreamReader
вот так:
InputStreamReader isr;
try {
isr = new InputStreamReader(inputStream, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
вот простой способ вывода строки (я создал метод для этого):
public static String (String input){
String output = "";
try {
/* From ISO-8859-1 to UTF-8 */
output = new String(input.getBytes("ISO-8859-1"), "UTF-8");
/* From UTF-8 to ISO-8859-1 */
output = new String(input.getBytes("UTF-8"), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return output;
}
// Example
input = "Música";
output = "Música";
Apache Commons IO класс Charsets может пригодится:
String utf8String = new String(org.apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())