我有以下代碼,它打印出來自字符串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'。 –