getBytes()问题用于重音字符

时间:2015-08-31 05:03:53

标签: java encoding utf-8

我正在尝试将带有特殊字符(如É)的字符串转换为带有UTF-8编码的字符串。我试过这样做:

String str = "MARIE-HÉLÈNE";
byte sByte[] = str.getBytes("UTF-8"); 
str = new String(sByte,"UTF-8");

问题是,当我"É".getBytes("UTF-8")时,我得到63被解释为'?'当它被转换为新的字符串时。我该如何解决这个问题?

编辑:我还注意到这个问题在Eclipse上无法重现,可能是因为文本文件编码通常设置为UTF-8。

我尝试在http://www.javarepl.com/console.html中执行byte[] str = "MARIE-HÉLÈNE".getBytes("UTF-8")并获得结果byte[] str = [77, 65, 82, 73, 69, 45, 72, 63, 76, 63, 78, 69]

2 个答案:

答案 0 :(得分:4)

当没有正确地向编译器(javac)提供有关源文件编码的信息时,就会发生这种错误。如果源文件的编码是UTF-8,请编译如下文件。

javac -encoding UTF-8 E.java

以下是源文件编码为UTF-16 Big Endian的情况的另一个例子。

javac -encoding UTF-16BE E.java

我已经确认下面的程序正确显示" 0xC3 0x89"。所以,你的代码没有问题。

public class E
{
    public static void main(String[] args) throws Exception
    {
        byte[] bytes = "É".getBytes("UTF-8");

        for (int i = 0; i < bytes.length; ++i)
        {
            System.out.format("0x%02X ", (byte)(bytes[i]));
        }

        System.out.println();
    }
}

答案 1 :(得分:1)

"É".getBytes("UTF-8")返回byte[] 2 字节:c3 89

"MARIE-HÉLÈNE"4d 41 52 49 45 2d 48 c3 89 4c c3 88 4e 45

4d 41 52 49 45 2d 48 c3 89 4c c3 88 4e 45
M  A  R  I  E  -  H  É     L  È     N  E

使用new String(bytes,"UTF-8")转换回字节将恢复原始字符串。