Java char / int转换混乱

时间:2010-07-09 21:42:50

标签: java encoding character-encoding

在Java中给出这个代码:

    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。我将这些值存储为String常量,并将这些常量的值写入UTF-8文件,但输出14 c3为c2。我对如何用Java转换这些字节序列的理解显然存在差距。

谢谢!

3 个答案:

答案 0 :(得分: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 :(得分:1)

"\u00fe"不是字节0xfe,它是Unicode代码点0xfe,当以UTF-8编码时,它可以变成多字节值(如上所示)

答案 2 :(得分:0)

你错过了一个字节:你应该得到14 c3 be c2 ae

对于最近六次os.write次调用,内部Java将每个字符存储在一个单字符的Unicode字符串中。当你致电getBytes时,这会给你这些字符的UTF-8表示。对于U + 00FE(þ),这是c3 be,而对于U + 00AE(®),它是c2 ae