java 编码

来源:互联网 发布:openssl linux 编辑:程序博客网 时间:2024/05/29 09:03
 
  1.    import java.io.*;
  2.    public class Test{
  3.     public static void main(String[] args){
  4.        String str = "你";
  5.    try{
  6.        FileWriter writer = new FileWriter("text.txt");
  7.        writer.write(str);
  8.        writer.close();
  9.    }catch(Exception e){ 
  10.    }
  11.    }
  12.    }

分别将上段程序在中文和英文环境下进行编译:

 

                  在中文环境 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字符集中没有对应的字符,因此显

示两个乱码。

原创粉丝点击