我最近意识到我并不完全理解Java的字符串编码过程。
考虑以下代码:
public class Main
{
public static void main(String[] args)
{
System.out.println(java.nio.charset.Charset.defaultCharset().name());
System.out.println("ack char: ^"); /* where ^ = 0x06, the ack char */
}
}
因为控制字符是interpreted differently between windows-1252 and ISO-8859-1,所以我选择ack
字符进行测试。
我现在用不同的文件编码、UTF-8、windows-1252和ISO-8859-1编译它。两者编译成完全相同的东西,逐个字节地编译,就像md5sum
验证的那样。
然后我运行这个程序:
$ java Main | hexdump -C
00000000 55 54 46 2d 38 0a 61 63 6b 20 63 68 61 72 3a 20 |UTF-8.ack char: |
00000010 06 0a |..|
00000012
$ java -Dfile.encoding=iso-8859-1 Main | hexdump -C
00000000 49 53 4f 2d 38 38 35 39 2d 31 0a 61 63 6b 20 63 |ISO-8859-1.ack c|
00000010 68 61 72 3a 20 06 0a |har: ..|
00000017
$ java -Dfile.encoding=windows-1252 Main | hexdump -C
00000000 77 69 6e 64 6f 77 73 2d 31 32 35 32 0a 61 63 6b |windows-1252.ack|
00000010 20 63 68 61 72 3a 20 06 0a | char: ..|
00000019
无论使用哪种编码,它都会正确地输出0x06
。
好的,它仍然输出相同的0x06
,这将被windows-1252代码页解释为可打印的确认字符。
这就引出了几个问题:
这是否意味着,如果不为当前的Java使用标准字符,那么在运行时,它们可能会被不同的解释?
https://stackoverflow.com/questions/2164804
复制相似问题