1.疑问
JDK编译JAVA文件生成的字节码.class文件是否与文件的编码方式有关,是否与语言环境有关,即Charset.defaultCharset()。
2.解决方法
1)编写一个简单的JAVA文件,内容如下:
package com.siyuan.jdk.test;
import java.nio.charset.Charset;
public class JDKCompileTest {
public static void main(String[] args) {
System.out.println(Charset.defaultCharset());
System.out.println("I AM 中国人");
}
}
2)以GBK,UTF-8格式保存两份到本地文件目录,并上传一份到Linux环境下,保存的目录结构如下
|-gbk
|-com/siyuan/jdk/test
|-JDKCompileTest.java
|-uft-8
|-com/siyuan/jdk/test
|-JDKCompileTest.java
3)为了避免开发工具对编译产生的影响,使用DOS和Shell指令对java文件进行编译
javac com\siyuan\jdk\test\JDKCompileTest.java
注:使用此语句在DOS下编译UTF-8文件时出错,原因是默认的语言环境是GBK,读取UTF-8内容出错,需使用-encoding参数,正确的语句如下
javac -encoding UTF-8 com\siyuan\jdk\test\JDKCompileTest.java
同理:由于Shell默认的语言环境为UTF-8,所以在Shell下编译GBK文件时会出错,但是实际却没有报错,不过结果出现异常,产生了乱码,当改用下述语句时,一切正常。
javac -encoding GBK com/siyuan/jdk/test/JDKCompileTest.java
4)把Linux上的编译结果保存到本地,比较四个不同的class文件,发现它们内容一致
注:windows中的JDK和Linux中的JDK大版本必须一致,否则会出现内容不一致的结果
3.结论
JDK编译产生的class文件与源文件的编码,与编译环境的语言无关。
4.延伸--class文件的格式和解析
格式篇
http://www.blogjava.net/javafan/archive/2008/02/01/jclass_ana.html
解析篇
http://www.blogjava.net/javafan/archive/2008/02/03/179135.html
通过阅读上述引用内容可知:class文件的内容为UTF-8编码格式