【根据实验和理论总结,不对之处,敬请指出,分享和完善】
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编码。
因此可以清楚的看到文件的编码是如何影响程序的编写。