当我运行以下程序时:
public static void main(String args[]) throws Exception
{
byte str[] = {(byte)0xEC, (byte)0x96, (byte)0xB4};
String s = new String(str, "UTF-8");
}
在Linux上并检查jdb中s的值,我正确得到:
s = "ì–´"
在Windows上,我错误地得到了:
s = "?"
我的字节序列是韩语中有效的UTF-8字符,为什么它会产生两个非常不同的结果?
答案 0 :(得分:3)
它正确地在我的计算机(Ubuntu Linux)上打印“어
”,如Code Table Korean Hangul中所述。已知Windows命令提示符存在编码问题,请不要打扰。
你的代码很好。
答案 1 :(得分:1)
它为我提供了어
。这意味着您的控制台可能未配置为显示UTF-8,这是打印/显示问题,而不是表示问题。
答案 2 :(得分:1)
您获得了正确的字符串,它的Windows控制台无法正确显示字符串。
这篇文章的link讨论了一种使Java控制台使用JNI生成正确的Unicode输出的方法。
答案 3 :(得分:0)
JDB正在错误地显示数据。代码在Windows和Linux上的工作方式相同。尝试运行这个更明确的测试:
public static void main(String[] args) throws Exception {
byte str[] = {(byte)0xEC, (byte)0x96, (byte)0xB4};
String s = new String(str, "UTF-8");
for(int i=0; i<s.length(); i++) {
System.out.println(BigInteger.valueOf((int)s.charAt(i)).toString(16));
}
}
这将打印出字符串中每个字符的十六进制值。这将在Windows和Linux中正确打印出“c5b4”。