- import java.io.*;
- public class Test{
- public static void main(String[] args){
- String str = "你";
- try{
- FileWriter writer = new FileWriter("text.txt");
- writer.write(str);
- writer.close();
- }catch(Exception e){
- }
- }
- }
分别将上段程序在中文和英文环境下进行编译:
在中文环境 javac -encoding gb2312 Test.java 生成的class文件中含有 e4 bd a0 字段
在英文环境 javac -encoding iso-8859-1 Test.java 生成的class文件中含有 c3 84 c3 a3 字段
原因:
“你”gb2312编码为 0xc4e3 (可以通过UltraEdit打开源文件查看),其Unicode码为 0x4f60(可以通过
System.out.println(Integer.toHexString(str.charAt(0)))得到)。在中文环境下,javac(sun.tools.Javac.main类)按中文编码方
式读取Test.java,在两种环境下读取代码文件中的“你”字时,类似分别执行了一下两部操作:
String gb=new String(new byte[]{(byte)0xc4,(byte)0xe3},"gb2312"); //中文环境
String iso=new String(new byte[]{(byte)0xc4,(byte)0xe3},"iso-8859-1"); //英文环境
中文环境中将两个字节0x4c,0xe3转变成0x4f60(“你”的unicode码);后者由于是iso-8859-1环境,将0x4c解释0x004c
和0x003e两个字符,因此iso的是两个字符组成的字符串,其长度为2。
在生成class文件的时候在中文环境下0x4f60就转变成UTF-8码 0xe4bda0;而在英文环境下生成0xc384c3a3。
将中文环境编译出来的class在英文环境下执行 java -Dfile.encoding=iso-8859-1 在输出的文件中是一个字符的乱码,原
因:程序在输出是把String按iso-8859-1编码转换到byte流,由于0x4f60没有对应的iso-8859-1字符,显示乱码3f,可以将前面的
通过执行gb.getBytes("iso-8859-1")得到;反之将英文环境下编译出来的class文件放在中文环境下执行,
java -Dfile.encoding=gb2312 在输出文件中出现两个乱码,原因:因为0x004c和0x003e在gb2312字符集中没有对应的字符,因此显
示两个乱码。