我有一小段代码,我在其中检查字符的代码点Ü。Locale lc = Locale.getDefault();System.out.println(lc.toString());System.out.println(Charset.defaultCharset());System.out.println(System.getProperty("file.encoding"));String inUnicode = "\u00dc";String glyph = "Ü";System.out.println("inUnicode " + inUnicode + " code point " + inUnicode.codePointAt(0));System.out.println("glyph " + glyph + " code point " + glyph.codePointAt(0));当我在 MacOS x 和 Windows 10 上运行此代码时,我获得了不同的代码点值,请参阅下面的输出。MacOS 上的输出en_USUTF-8UTF-8inUnicode Ü code point 220glyph Ü code point 220Windows 上的输出en_USwindows-1252Cp1252in unicode Ü code point 220glyph ?? code point 195我在https://en.wikipedia.org/wiki/Windows-1252#Character_set检查了 windows-1252 的代码页,这里的代码点Ü是220. 对于String glyph = "Ü";为什么会出现代码点为195在Windows?根据我的理解,glyph应该已经正确呈现,并且代码点应该是220因为它是在 Windows-1252 中定义的。如果我替换String glyph = "Ü";为String glyph = new String("Ü".getBytes(), Charset.forName("UTF-8"));然后glyph正确呈现并且代码点值为220. 无论语言环境和字符集如何,这是在任何操作系统上标准化 String 行为的正确有效方法吗?
1 回答
狐的传说
TA贡献1804条经验 获得超3个赞
195 是十六进制的 0xC3。
在 UTF-8 中,Ü
编码为 bytes 0xC3 0x9C
。
System.getProperty("file.encoding")
说 Windows 上的默认文件编码不是 UTF-8,但很明显你的 Java 文件实际上是用 UTF-8 编码的。println()
输出的事实glyph ??
(注 2 ?
,意味着char
存在2 s),并且您能够使用 UTF-8 解码原始字符串字节Charset
,证明了这一点。
glyph
应该具有单一的char
,其值是0x00DC
,而不是2个char
(胡)的值是0x00C3 0x009C
。 在 Windows 上getCodepointAt(0)
返回0x00C3
(195),因为您的 Java 文件是用 UTF-8 编码的,但正在加载,就好像它是用 Windows-1252 编码的一样,所以 2 个字节0xC3 0x9C
被解码为 characters0x00C3 0x009C
而不是 character 0x00DC
。
您需要在运行 Java 时指定实际的文件编码,例如:
java -Dfile.encoding=UTF-8 ...
添加回答
举报
0/150
提交
取消