JAVA总结:sun.jnu.encoding与file.encoding的区别

Posted javaPie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA总结:sun.jnu.encoding与file.encoding的区别相关的知识,希望对你有一定的参考价值。

JAVA总结(三):sun.jnu.encoding与file.encoding的区别

2017年08月10日 19:39:24 蚁方阵 阅读数:1704 标签: java编码字节码二进制class文件 更多

个人分类: java

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yiifaa/article/details/77072656

先说结论,sun.jnu.encoding是指操作系统的默认编码,file.encoding是指JAVA文件的编码(请记住,不是class文件,所有class文件的编码都是UTF-8),所以,在同一个操作系统上运行的JAVA应用程序,其sun.jnu.encoding完全相同,而file.encoding即使在同一个JAVA应用程序中,JAVA文件的编码也可以不一样。

在大部分的情况下,sun.jnu.encoding对我们都是透明的。

以Windows为例,利用chcp查看默认编码:

chcp
# 输出936,也就是GBK
  • 1
  • 2

所以在本机运行的所有JAVA进程,sun.jnu.encoding都是GBK。

有人说sun.jnu.encoding用于文件名的编码,flle.encoding用于文件内容的编码,真的正确吗?看下面的例子:

//  此JAVA文件用UTF-8进行编码
public class SunEncodingTest 

    public static void main(String[] args) throws  IOException 
        //  输出结果与文件编码一致
        System.out.println(Charset.defaultCharset());
        createFile();
    

    public static void createFile() throws IOException 
        String fileName = "国际米兰.txt";
        File file = new File(fileName);
        if(!file.exists()) 
            file.createNewFile();
        
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
        writer.write(fileName);
        writer.close();
    


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

按照上述结论的话,那么在系统中产生的文件名应该是中文乱码才对,但经过多次测试,文件名依旧显示正常,所以sun.jnu.encoding用于文件名的编码不是太靠得住的。

继续看一个有意思的现象,我们再创建一个JAVA文件,但采用GBK编码,并在常量中直接写入中文字符,如下:

public class OsEncode 

    public final static String ENCODE_STR = "国际米兰";

    public static String encode() 
        return Charset.defaultCharset().name();
    

    public static void main(String[] args) throws IOException 
        //  输出结果与文件编码一致,GBK
        System.out.println(encode());
    

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

如果此文件作为主函数运行,输出的结果为GBK,但其作为服务被UTF-8的JAVA类调用时,则输出UTF-8,很有意思吧!

继续测试,如果在第一个类里(UTF-8编码)也声明常量ENCODE_STR,并取值为”国际米兰”,这时我们利用winhex查看class的字节码文件,我们可以发现国际米兰都被翻译成了相同的二进制,如下:

E5 9B BD E9 99 85 E7 B1 B3 E5 85 B0
  • 1

经过演算,我们可以算出国际米兰的UTF-8编码正是上述字节。

结论

无论JAVA文件(文本)采用什么编码,转换为class时,都会转为UTF-8编码。

以上是关于JAVA总结:sun.jnu.encoding与file.encoding的区别的主要内容,如果未能解决你的问题,请参考以下文章

Java 的系统属性 sun.jnu.encoding 和 file.encoding 的区别

sun.jnu.encoding=UTF-8可以修改吗

Java读取linux系统中文文件名时候乱码,并显示文件不存在

20165233 Java第三章学习总结

java程序设计期末复习总结&复盘

20165230 2017-2018-2 《Java程序设计》第2周学习总结