我正在尝试将带有特殊字符(如É)的字符串转换为带有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]
答案 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")
转换回字节将恢复原始字符串。