如何在Java中的ISO-8859-1和UTF-8之间转换?


Answers:


102

通常,您无法执行此操作。UTF-8能够编码任何Unicode代码点。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进行更多控制。例如,您可以在发现无法编码的字符时引发异常,或者将其他字符用于替换文本。


1
有关字符编码的更多信息,以及为什么从UTF-8转换为ISO-8859(或ASCII或ANSI)没有什么意义,请参阅以下说明:joelonsoftware.com/articles/Unicode.html
JRG-Developer

以下是上述链接的摘要:There are hundreds of traditional encodings which can only store some code points correctly and change all the other code points into question marks. Some popular encodings of English text are Windows-1252 (the Windows 9x standard for Western European languages) and ISO-8859-1, aka Latin-1 (also useful for any Western European language). But try to store Russian or Hebrew letters [or special chars] in these encodings and you get a bunch of question marks. UTF 7, 8, 16, and 32 all have the nice property of being able to store any code point correctly.
JRG-Developer

值得一提的是Windows-1252(Windows拉丁语1)通过填充一些“ Unicode控件”字符0x80-0xbf扩展了ISO-8859-1(官方拉丁语1)。甚至Mac和Linux上的浏览器都尊重这一点。因此,在某些地方,请使用Windows-1252。
Joop Eggen

17

对我 有用的:(“üzümbağ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 a=new String(encodedWithUTF8.getBytes("ISO88591"), "ISO-8859-1")String b=new String(encodedWithUTF8.getBytes("ISO88591"), "UTF-8")?如果字符串采用一种编码方式,而我们使用另一种编码方式获得字节,那么幕后情况是什么?
parsecer

您可以尝试使用它们并在IDE上查看结果,如果您遵循此URLdocs.oracle.com/javase/7/docs/api/java/lang/…,您将看到方法定义。我不知道该过程的确切细节。
巴哈迪尔·塔斯迈尔

1
如果有人需要这个-我觉得上面的命令将执行以下操作:a将采取UTF-8的字节,将它们转换成ISO字节,然后使用一个表bytes->charsISO编码打印串出。如果是字符串b,它将使用一个表bytes->charsUTF-8因此ISO根据UTF规则在本质上映射了字节。 a即使是,也可以将OK打印出来ISO,因为Java不会弄乱它在内部存储的字节。b可能会损坏,因为某些ISO字符将被打印出来,就像它们属于UTF编码一样。
parsecer

是否有任何第三方工具可以将存储库中的所有文件转换为UTF-8?
萨米(Sami),

6

如果您有String,则可以执行以下操作:

String s = "test";
try {
    s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
    uee.printStackTrace();
}

如果你有一个“破” String,你做错了什么,转换StringString另一种编码defenetely不是要走的路!您可以将a转换String为a byte[],反之亦然(给定编码)。在JavaString中,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();
}

1
如果您有InputStream,则应使用InputStreamReader对其进行包装。
埃里克森

5

这是使用String输出的简单方法(我创建了一个方法来执行此操作):

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";

1

正则表达式也可以很好并且可以有效地使用(替换未ISO-8859-1用空格覆盖的所有UTF-8字符):

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);


0

这是将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策略=اÙغÙاÙString_ISO_8859_1To_UTF_8 =الغلاف


0

将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");
}

此外,一种无需使用String类的构造函数即可将ISO-8859-1字符串转换为UTF-8字符串的方法。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.