JAVA的IED编译环境对编码的影响:

 【根据实验和理论总结,不对之处,敬请指出,分享和完善】

 

JAVA的IED编译环境对编码的影响:

 

  IDE编译环境编码: UTF-8

   测试源文件:d:/测试中文testchinese.html 文件编码为UTF-8编码,

内容为:测试中文test。

 

  public static void testUTF8() throws Exception

    {

       java.io.FileInputStream is=new java.io.FileInputStream("d:/测试中文test.html");

       byte[] b=new byte[1024];

       int len=is.read(b);

       byte[] bb=new byte[len];

       System.arraycopy(b, 0, bb, 0, len);

       String str=new String(bb);

       System.out.println(str+""+bb.length);

       for(byte b1:bb)

       {

           System.out.println(Integer.toHexString(b1));

        }

    }

  结果:字节数组长度为16,str的长度8,  中文可以正确显示,原因是编译的IDE环境是UTF-8,如果此时传值“测试中文test”给服务器进行远程存储,服务器的解析编码如果是UTF-8,那么可以正确解析该文件的文件名,而不会乱码。

   测试中文test16

ffffffe6

ffffffb5

ffffff8b

ffffffe8

ffffffaf

ffffff95

ffffffe4

ffffffb8

ffffffad

ffffffe6

ffffff96

ffffff87

74

65

73

74

 

 

IDE编译环境编码:GBK

   测试源文件:d:/测试中文testchinese.html 文件编码为UTF-8编码,

内容为:测试中文test。

  此时执行上述代码, 结果为乱码。字节数组长度为16,str的长度为10,可以看出有10个字符。

娴嬭瘯涓枃test16

ffffffe6

ffffffb5

ffffff8b

ffffffe8

ffffffaf

ffffff95

ffffffe4

ffffffb8

ffffffad

ffffffe6

ffffff96

ffffff87

74

65

73

74 

 

修改代码增加str=new String(str.getBytes("GBK"),"UTF-8");

  public static void testUTF8() throws Exception

    {

       java.io.FileInputStream is=new java.io.FileInputStream("d:/测试中文testchinese.html");

       byte[] b=new byte[1024];

       int len=is.read(b);

       byte[] bb=new byte[len];

       System.arraycopy(b, 0, bb, 0, len);

       String str=new String(bb);

       str=new String(str.getBytes("GBK"),"UTF-8");

       System.out.println(str+""+bb.length);

       for(byte b1:bb)

       {

           System.out.println(Integer.toHexString(b1));

        }

    }

执行结果为:字节数组为16,str长度为8,正常中文。

测试中文test16

ffffffe6

ffffffb5

ffffff8b

ffffffe8

ffffffaf

ffffff95

ffffffe4

ffffffb8

ffffffad

ffffffe6

ffffff96

ffffff87

74

65

73

74

 

结论:首先应该从环境的编码理解。

      1 Java源文件的编码

      2 Java编译后的执行编码

      3 操作系统的编码

  

   Java源文件的编码是编程时的文件编码,如果在eclipse中设置为GBK,则文件编码为GBK,而编译后的执行编码class文件则是以unicode utf-8存储,这样就可以保证在不同的编码环境下的源文件不会影响class文件的编码,它可以在不同的编码平台上执行,但是源文件如果是GBK编码的就不能在UTF-8下被正确显示,例如在中文windows环境下的中文在linux的英文环境下中文编码的十六进制为3f,字符为?,反过来一样甚至不能保存,原因在于GBK的代码范围小于UTF-8,当某些UTF-8的编码在GBK中无对应时会无法保存源文件。

一个有趣的现象是,eclipse中反复改变文件编码后,中文会变成乱码。原因就在于反复进行编码成乱码和再对乱码编码的原因。

   GBK编码的一个中文字符为两个字节,unicode的中文编码为3个字节,因此就会出现4个utf-8编码的中文在GBK编码下是6个,

   如果在纯java的环境下运行,是不用担心编码问题,无论什么样的源文件编码都会被对应的变为unicode编码,保证其在不同的操作系统环境下一致。

   上述UTF-8的编码文件读取后,显示的结果是GBK的编码结果,因此被强行有3个字节解析为2个字节,12个字节被解析为6个GBK编码存储后的unicode汉字,因此如果要显示为正确的中文,需要做操作str=new String(str.getBytes("GBK"),"UTF-8");,此时会首先将unicode存储的6个汉字的乱码按GBK编码的形式获取字节数组,这就是原始未发生任何变化的字节数组了,此时再按照UTF-8编码会变为正确的4个汉字,这4个汉字会自动翻译为class的unicode编码,无论怎么书写编码转换语句,只要是正常的中文编码都会生成一模一样的class编码。

   因此可以清楚的看到文件的编码是如何影响程序的编写。

你可能感兴趣的:(JAVA的IED编译环境对编码的影响:)