实验步骤
- CharSetTest.java文件(内容如下)在Windows下编译为class文件:
import java.nio.charset.Charset; import java.io.OutputStreamWriter; import java.io.ByteArrayOutputStream; public class CharSetTest { public static void main(String[] args) { System.out.println("Default Charset=" + Charset.defaultCharset()); System.setProperty("file.encoding", "Latin-1"); System.out.println("file.encoding=" + System.getProperty("file.encoding")); System.out.println("Default Charset=" + Charset.defaultCharset()); System.out.println("Default Charset in Use=" + getDefaultCharSet());
System.out.println("Default 字符集(在使用中的)=" + getDefaultCharSet()); } private static String getDefaultCharSet() { OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream()); String enc = writer.getEncoding(); return enc; } }
- ftp到Red Hat Linux上运行:
/opt/jdk1.6.0_35/bin/java CharSetTest
Default Charset=UTF-8 file.encoding=Latin-1 Default Charset=UTF-8 Default Charset in Use=UTF8 Default 字符集(在使用中的)=UTF8
/opt/jdk1.6.0_35/bin/java -Dfile.encoding=GBK CharSetTest
Default Charset=GBK file.encoding=Latin-1 Default Charset=GBK Default Charset in Use=GBK Default ؖ·՚ʹԃאµģ©=GBK
(将XShell的显示编码改为GBK后可以正常显示汉字)
/opt/jdk1.6.0_35/bin/java -Dfile.encoding=UTF-8 CharSetTest Default Charset=UTF-8 file.encoding=Latin-1 Default Charset=UTF-8 Default Charset in Use=UTF8 Default 字符集(在使用中的)=UTF8
- 本地Windows上运行
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe CharSetTest Default Charset=GBK file.encoding=Latin-1 Default Charset=GBK Default Charset in Use=GBK Default 字符集(在使用中的)=GBK
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe -Dfile.encoding=GBK CharSetTest
Default Charset=GBK file.encoding=Latin-1 Default Charset=GBK Default Charset in Use=GBK Default 字符集(在使用中的)=GBK
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe -Dfile.encoding=UTF-8 CharSetTest Default Charset=UTF-8 file.encoding=Latin-1 Default Charset=UTF-8 Default Charset in Use=UTF8 Default 瀛楃闆嗭紙鍦ㄤ娇鐢ㄤ腑鐨勶級=UTF8
结果分析
Java文件使用GBK编码,但class文件中汉字是用UTF-8编码的,47上的测试表明不论-Dfile.encoding的值是什么,只要把与XShell的显示编码保持一致就可以正确显示。
参考文献:
http://stackoverflow.com/questions/1749064/how-to-find-default-charset-encoding-in-java
http://stackoverflow.com/questions/2677419/determining-default-character-set-of-platform-in-java
http://stackoverflow.com/questions/5306153/how-to-get-terminals-character-encoding