我有以下代码,它打印出来自字符串s0
和s1
的字节;输出结果评论:Java获取字符的十进制字节表示形式
public static void main(String[] args) throws UnsupportedEncodingException {
String s0="H\u00ebllo";
String s1="Hëllo";
byte[] bytes=s0.getBytes("ISO8859_1"); //72 -21 108 108 111
//byte[] bytes=s1.getBytes("ISO8859_1"); //72 -61 -85 108 108 111
//byte[] bytes=s0.getBytes("UTF-8"); //72 -61 -85 108 108 111
//byte[] bytes=s1.getBytes("UTF-8"); //72 -61 -125 -62 -85 108 108 111
for (int i=0, i<bytes.length; i++) {
System.out.println(bytes[i]);
}
}
我不明白的是这些数字来自哪里。如果所有字符代码都应该是正数,为什么会有负数?为什么在第二种情况下有6个数字?为什么ë
字符的数字在使用Unicode符号和字面值时有所不同?
编辑:
我了解,这些数字来自第一被转换为无符号数:
ë(ISO8859_1) = 0xeb = 235 = 11101011 = -21 (two's complement for signed numbers)
ë (UTF-8) = 0xc3 0xab => 0xc3 = 195 = 11000011 = -61, 0xab = 171 = 10101011 = -85
但我还是不明白的是s0
和s1
字符串之间的差异。在这两种情况下,我要求从getBytes()
ISO8859_1
字节,而在第二种情况下,我仍然得到UTF-8
的字节。
编辑:
而且byte[] bytes=s1.getBytes("UTF-8");
结果输出:
72 -61 -125 -62 -85 108 108 111
我真的很困惑。
编辑:
System.out.println(System.getProperty("file.encoding"));
System.out.println(java.nio.charset.Charset.defaultCharset());
两个给UTF-8
。源文件在UTF-8
。
'k'的用途是什么? – Andreas
@Andreas,它是大型项目的一部分,因个人原因需要'k'。无论如何编辑帖子。 – parsecer
再一次,您的源文件以UTF-8格式存储,所以'ë'存储为两个字节。你的编译器采用了不同的编码方式,并将UTF-8'''曲解为'?',所以当代码执行时,它不知道有关'Hëllo'的任何信息,而只知道'Hëllo'。 –