当我们编辑了一个Java源文件保存时,是以操作系统默认的字符编码保存的(Windows xp默认字符集是GBK)。当调用javac命令时,会把源文件进行一次编码转换,如果没有指定字符集,就从操作系统默认的字符集转换成Java内部默认的unicode字符集,然后再将源文件编译成class文件,并且以unicode的编码形式保存到硬盘上。
在windows xp上使用记事本编辑源文件,
public class Test{
public static void main(String[] args){
System.out.println("你好!");
}
}
然后保存,保存的编码是GBK,即xp默认的字符编码。
编译的时候指定字符集为utf-8
C:\Documents and Settings\Administrator\桌面>javac -encoding utf-8 Test.java
输出以下结果
Test.java:3: 警告:编码 utf-8 的不可映射字符
System.out.println("????");
^
Test.java:3: 警告:编码 utf-8 的不可映射字符
System.out.println("????");
^
Test.java:3: 警告:编码 utf-8 的不可映射字符
System.out.println("????");
^
3 警告
C:\Documents and Settings\Administrator\桌面>
编译虽然通过,但是报出了警告,这是因为源文件的编码和转换的编码不一致。
运行
C:\Documents and Settings\Administrator\桌面>java Test
????
C:\Documents and Settings\Administrator\桌面>
输出的是乱码。