Java中的字符编码


字符集、字符编码基础


String 和 字节序列


Python中的字符编码

本文是针对Python2x的

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> import sys
>>> reload(sys)

>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'

需要特别注意的是,当混用str和unicode的时候,Python会尝试用默认的编码对str进行解码:
python-encoding-1.png


例1

// filename: Main.java

public class Main {
    public static void main(String[] args) throws Exception {
        // javac会使用-encoding选项指定的或操作系统默认的字符编码对源代码进行解码
        String string = "汉";

        System.out.println("Internal:");
        for (int ind=0; ind<string.length(); ++ind)
            System.out.print(String.format("\t%x", (int)string.charAt(ind)));

        System.out.print("\nUTF-8:\n\t");
        byte[] bytes = string.getBytes("UTF-8");
        for (byte b: bytes)
            System.out.print(String.format("%1$x", b));

        System.out.print("\nGBK:\n\t");
        bytes = string.getBytes("GBK");
        for (byte b: bytes)
            System.out.print(String.format("%1$x", b));
    }
}

IDEA的右下角可以指定源代码文件的字符编码:
java-encoding-1.png
将上面的源代码文件的编码设置为UTF-8。
因为windows的默认编码是GBK,所以执行javac Main.java,编译源代码文件时,会报错:
java-encoding-2.png
可以通过-encoding命令行选项来指定源代码文件的编码:javac -encoding UTF-8 Main.java
执行编译后得到的class:
java Main
输出如下:
java-encoding-3.png
可见:unicode字符“汉”在JVM内部被存储为6C49,对应的UTF-8字节序列是E6 B1 89,对应的GBK字节序列是BA BA。


例2

public class Main {
    public static void main(String[] args) throws Exception {
        byte[] bytes = new byte[]{-26, -79, -119};
        System.out.println("file.encoding=" + System.getProperty("file.encoding"));
        System.out.println(new String(bytes));
    }
}

编译:

javac Main.java

执行:

java Main

输出如下:
java-encoding-4.png
使用GBK编码给UTF-8字节序列解码的时候,会出乱码。可以通过-Dfile.encoding=xxx的方式指定默认编码:

java -Dfile.encoding=UTF-8 Main

输出如下:
java-encoding-5.png