首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从编译到运行时,Java字符串编码到底是如何工作的

从编译到运行时,Java字符串编码到底是如何工作的
EN

Stack Overflow用户
提问于 2010-01-30 04:06:09
回答 4查看 8.9K关注 0票数 20

我最近意识到我并不完全理解Java的字符串编码过程。

考虑以下代码:

代码语言:javascript
复制
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-1252ISO-8859-1编译它。两者编译成完全相同的东西,逐个字节地编译,就像md5sum验证的那样。

然后我运行这个程序:

代码语言:javascript
复制
$ 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代码页解释为可打印的确认字符。

这就引出了几个问题:

  1. 正在编译的Java文件的代码页/字符集是否期望与正在编译它的系统的默认字符集相同?这两个always synonymous?
  2. The编译表示看起来并不依赖于编译时字符集,真的是这样吗?

这是否意味着,如果不为当前的Java使用标准字符,那么在运行时,它们可能会被不同的解释?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2164804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档