【发布时间】:2017-02-28 17:35:03
【问题描述】:
我有以下代码:
String s0="Përshëndetje botë!";
byte[] b1=s0.getBytes("UTF8");
byte[] b2=s0.getBytes("ISO8859_1");
String s0_utf8=new String(b1, "UTF8"); //right encoding, wrong characters
//String s0_utf8=new String(b1, "ISO8859_1"); //wrong encoding, wrong characters
String s0_iso=new String(b2, "UTF8"); //wrong encoding; outputs right characters
//String s0_iso=new String(b2, "ISO-8859-1"); //right encoding; if uncommented, outputs damaged characters
System.out.println("s0_utf8: "+s0_utf8); //
System.out.println("s0_iso: "+s0_iso);
因此,字符串"Përshëndetje botë!" 使用UTF8 和ISO-8859-1 转换为字节,然后使用相应的编码将这些字节转换回Unicode 字符。此处仅在一种情况下显示正确的字符:如果我们使用ISO8859_1 将原始字符串编码为字节并使用UTF-8 对其进行解码。所有其他情况都会导致错误的字符。
String s0="P\u00ebrsh\u00ebndetje bot\u00eb!";
byte[] b1=s0.getBytes("UTF8");
byte[] b2=s0.getBytes("ISO8859_1");
String s0_utf8=new String(b1, "UTF8"); //right encoding; outputs right characters
//String s0_utf8=new String(b1, "ISO8859_1"); //wrong encoding, wrong characters
String s0_iso=new String(b2, "UTF8"); //wrong encoding; outputs wrong characters
//String s0_iso=new String(b2, "ISO-8859-1"); //right encoding; if uncommented, outputs damaged characters
System.out.println("s0_utf8: "+s0_utf8); //
System.out.println("s0_iso: "+s0_iso);
这里有两种情况会显示正确的单词:当字符串同时使用相同的编码进行编码和解码时。
我不明白这里发生了什么。这怎么可能? Unicode 的字符表示有何不同?为什么将 enode 与 iso - decode with utf8 工作?结果字符串不应该与原始字符串完全不同吗,因为 utf8 可能对 iso 的字节进行不同的解释?
【问题讨论】:
-
I don't get the behavior you describe at all. 编码为 utf8,解码为 utf8 打印正确的字符串。编码为iso,解码为utf8不。
-
@Sotirios Delimanolis 嗯,我在这里尝试了在线编译器compilejava.net,它的工作原理与解释的一样......
标签: java unicode encoding utf-8 character-encoding