美文网首页
编码之JVM之外与之内

编码之JVM之外与之内

作者: 逗比喵喵 | 来源:发表于2019-10-06 23:30 被阅读0次

    JVM之外

    在 JVM 之外, .java 文件可以采用多种编码格式:

    • UTF-8 - unix linux 默认
    • GBK - 中文 windows 平台默认

    当将源码用 Javac 编译的时候, 默认是按照系统默认的编码格式读取 Java 源文件,
    然后以 UTF-8 的格式输出到 .class 字节码文件中
    .

    换句话说:

    • 默认情况下在 Unix 平台, Javac 用 UTF-8 格式读取源文件然后以 UTF-8 格式写 .class
    • 默认情况下在中文 windows 平台, Javac 用 GBK 格式读取源文件然后同样以 UTF-8 格式写 .class

    JVM之内

    当运行代码时, 读入到内存里的字符(char)或字符串(String), 实质上都是用 char 来表示的(String 实质是 char[]), 而 char 是采用 UTF-16 来编码的.

    但需要注意, char 永远是 2 个字节. 但对于超过 2 个字节的 UTF-16 编码的字符来说. 需要多个 char 来表示. 比如 emoji 表情. 比如某些 APP 输入框输入表情占用了 2 个字符. 就是字符串长度不等于字符长度的问题!

    String a = new String(new byte[]{(byte)0xF3, (byte)0x3F, (byte)0xF2, (byte)0x2F});
    System.out.println(a);
    System.out.println(a.toCharArray().length); // 输出 2
    

    输出 2, 也就是 2 个 char 即 4 个字节.

    总结

    • JVM 外部, Javac 默认是按照系统默认的编码格式读取 Java 源文件, 但是统一按 UTF-8 编译 .class 字节码文件.
    • JVM 内部采用 UTF-16 编码

    相关文章

      网友评论

          本文标题:编码之JVM之外与之内

          本文链接:https://www.haomeiwen.com/subject/tmyppctx.html