2010-07-09 84 views
0

鑑於這種代碼在Java中:的Java字符/ INT轉換混亂

FileOutputStream os = new FileOutputStream("/tmp/test.dat"); 
    os.write(0x14); 
    os.write(0xfe); 
    os.write(0xae); 

    os.write(String.valueOf((char) 0x14).getBytes("UTF-8")); 
    os.write(String.valueOf((char) 0xfe).getBytes("UTF-8")); 
    os.write(String.valueOf((char) 0xae).getBytes("UTF-8")); 

    os.write("\u0014".getBytes("UTF-8")); 
    os.write("\u00fe".getBytes("UTF-8")); 
    os.write("\u00ae".getBytes("UTF-8")); 

    os.close(); 

有人可以給我解釋爲什麼在TEST.DAT前3個字節是

14 fe ae 

而從最後的輸出6 os.write()的是

14 c3 be c2 

基本上,我想逐字輸出字節14 fe ae。我將這些值存儲爲一個字符串常量,並將這些常量的值寫入UTF-8文件,但輸出結果爲14 c3爲c2。在我理解Java中如何轉換這些字節序列方面顯然存在差距。

謝謝!

回答

4

它提供:

0x 14 fe ae 14 c3 be c2 ae 14 c3 be c2 ae 

前三個字節是顯而易見的。他們只是從字面上輸出。對於接下來的三個,你應該記住,Java中的char代表一個UTF-16代碼單元,而不是一個字節。因此,您首先要創建Unicode代碼單元U + 0014,U + 00FE,U + 00AE,然後將其轉換爲UTF-8。 U + 0014在UTF-8中爲0x14(因爲它也是ASCII),但U + 00FE是0xC3 0xBE,U + 00AE是0xC2 0xAE。

您將在接下來的三行中再次創建相同的字符。

底線是,如果你想存儲文字字節,只需使用一個字節數組。

1

"\u00fe"不是字節0xfe,它是Unicode代碼點0xfe,當它以UTF-8編碼時可以變成多字節值(如上所示)。

0

你錯過了一個字節:你應該得到14 c3 be c2 ae

對於您最近的六個os.write調用,內部Java將每個字符存儲爲一個字符的Unicode字符串。當您撥打getBytes時,會顯示這些字符的UTF-8表示。對於U + 00FE(þ),這是c3 be,而對於U + 00AE(®),它是c2 ae