代码应使用正确的编码进行编译:
javac -encoding UTF-8 Foo.java
那里会有编码不匹配的地方。
public class Foo {
char [] a = {'à', 'á', 'â', 'ä' };
}
上面保存为 UTF-8 的代码应该成为十六进制转储:
70 75 62 6C 69 63 20 63 6C 61 73 73 20 46 6F 6F public class Foo
20 7B 0D 0A 20 20 63 68 61 72 20 5B 5D 20 61 20 {__ char [] a
3D 20 7B 27 C3 A0 27 2C 20 27 C3 A1 27 2C 20 27 = {'__', '__', '
C3 A2 27 2C 20 27 C3 A4 27 20 7D 3B 20 20 0D 0A __', '__' }; __
7D 0D 0A 0D 0A }____
代码点 U+00E0 (à) 的 UTF-8 值为C3 A0
.
代码应使用正确的编码进行编译:
javac -encoding UTF-8 Foo.java
有一个外部机会,à 将由组合序列 U+0061 U+0300 表示。这是NFD表单(我从未遇到过将其用作文本输入默认值的文本编辑器)。正如Thorbjørn Ravn Andersen 指出的那样,总是使用 \uXXXX 转义序列通常会更好 - 它不那么模棱两可。
您还需要检查您的输入设备(文件/控制台/等)
作为最后的手段,您可以将您char
的 s 转储为十六进制System.out.format("%04x", (int) c);
并尝试使用字符检查器手动解码它们以找出它们是什么。