Как конвертировать между 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");вы можете осуществлять больше контроля с помощью нижнего уровня
CharsetAPI-интерфейсы. Например, можно создать исключение при обнаружении некодируемого символа или использовать другой символ для замены текста.
, который работал для меня: ("ü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, вы сделали что-то не так, преобразовав aStringдоStringв другой кодировке это defenetely не путь! Вы можете конвертироватьStringдоbyte[]и наоборот (учитывая кодировку). В JavaStringС, насколько мне известно, закодированных сUTF-16но это деталь реализации.скажем, у вас есть
InputStream, вы можете прочитать вbyte[]а затем преобразовать это в aStringиспользуя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 кодировок класс может пригодится:
String utf8String = new String(org.apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())
Comments