Как я могу конвертировать между ISO-8859-1 и UTF-8 в Java?
Кто-нибудь знает, как преобразовать строку из ISO-8859-1 в UTF-8 и обратно в Java?
Я получаю строку из Интернета и сохраняю ее в RMS (J2ME), но я хочу сохранить специальные символы и получить строку из RMS, но с кодировкой ISO-8859-1. Как мне это сделать?
7 ответов
В общем, вы не можете сделать это. UTF-8 способен кодировать любую кодовую точку Unicode. ISO-8859-1 может обрабатывать только малую часть из них. Таким образом, перекодировка из ISO-8859-1 в UTF-8 не является проблемой. Переход назад от UTF-8 к ISO-8859-1 приведет к тому, что в тексте появятся "заменяющие символы" (text) при обнаружении неподдерживаемых символов.
Для перекодирования текста:
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ı"
Вот простой способ вывода строки (я создал метод для этого):
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";
Если у тебя есть String
, Вы можете сделать это:
String s = "test";
try {
s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
Если у вас есть "сломан" String
, вы сделали что-то не так, преобразовав String
к String
в другой кодировке это определенно не тот путь! Вы можете конвертировать String
к byte[]
и наоборот (с учетом кодировки). На яве String
с 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();
}
Самый простой способ преобразовать строку ISO-8859-1 в строку UTF-8.
private static String convertIsoToUTF8(String example) throws UnsupportedEncodingException {
return new String(example.getBytes("ISO-8859-1"), "utf-8");
}
Если мы хотим преобразовать строку UTF-8 в строку ISO-8859-1.
private static String convertUTF8ToISO(String example) throws UnsupportedEncodingException {
return new String(example.getBytes("utf-8"), "ISO-8859-1");
}
Более того, метод, преобразующий строку ISO-8859-1 в строку UTF-8 без использования конструктора класса String.
public static String convertISO_to_UTF8_personal(String strISO_8859_1) {
String res = "";
int i = 0;
for (i = 0; i < strISO_8859_1.length() - 1; i++) {
char ch = strISO_8859_1.charAt(i);
char chNext = strISO_8859_1.charAt(i + 1);
if (ch <= 127) {
res += ch;
} else if (ch == 194 && chNext >= 128 && chNext <= 191) {
res += chNext;
} else if(ch == 195 && chNext >= 128 && chNext <= 191){
int resNum = chNext + 64;
res += (char) resNum;
} else if(ch == 194){
res += (char) 173;
} else if(ch == 195){
res += (char) 224;
}
}
char ch = strISO_8859_1.charAt(i);
if (ch <= 127 ){
res += ch;
}
return res;
}
}
Этот метод основан на включении utf-8 в iso-8859-1 этого веб-сайта.Кодирование utf-8 в iso-8859-1
Регулярное выражение также может быть хорошим и эффективно использоваться (заменяет все символы UTF-8, не охваченные ISO-8859-1
с пробелом):
String input = "€Tes¶ti©ng [§] al€l o€f i¶t _ - À ÆÑ with some 9umbers as"
+ " w2921**#$%!@# well Ü, or ü, is a chaŒracte⚽";
String output = input.replaceAll("[^\\u0020-\\u007e\\u00a0-\\u00ff]", " ");
System.out.println("Input = " + input);
System.out.println("Output = " + output);
Вот функция для преобразования UNICODE (ISO_8859_1) в UTF-8
public static String String_ISO_8859_1To_UTF_8(String strISO_8859_1) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strISO_8859_1.length(); i++) {
final char ch = strISO_8859_1.charAt(i);
if (ch <= 127)
{
stringBuilder.append(ch);
}
else
{
stringBuilder.append(String.format("%02x", (int)ch));
}
}
String s = stringBuilder.toString();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
String strUTF_8 =new String(data, StandardCharsets.UTF_8);
return strUTF_8;
}
ТЕСТОВОЕ ЗАДАНИЕ
String strA_ISO_8859_1_i = new String("الغلاف".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
System.out.println("ISO_8859_1 strA est = "+ strA_ISO_8859_1_i + "\n String_ISO_8859_1To_UTF_8 = " + String_ISO_8859_1To_UTF_8(strA_ISO_8859_1_i));
РЕЗУЛЬТАТ
ISO_8859_1 strA est = اÙغÙا٠String_ISO_8859_1To_UTF_8 = الغلاف