Java| Charset.defaultCharset()和file.encoding的关系

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


一. Charset.defaultCharset()系统默认编码字符集介绍

说明

返回此 Java 虚拟机的默认 charset。默认 charset 在虚拟机启动时决定,通常根据语言环境和底层操作系统的 charset 来确定。

Charset.defaultCharset()是操作系统的编码,可以通过虚拟机启动时指定属性-Dfile.encoding=UTF-8,来更改Charset.defaultcharset().
Charset.defaultcharset()指的是jvm输入流、输出流默认使用的编码/解码方式。

规则

当我们需要指定编码格式,可以通过JVM参数在启动的时候进行设置-Dfile.encoding=XXX,从而不受操作系统和语言环境的影响.
获取默认编码格式的源码如下:
①当我们不手动设置JVM参数-Dfile.encoding时,系统默认字符集则取决于语言环境和底层操作系统(Windows的CMD下是GBK,Linux下则跟设置的语言环境有关)
②当我们手动设置JVM参数-Dfile.encoding=xxx,如果xxx是不支持的字符集,则默认使用’UTF-8’编码.

public static Charset defaultCharset() {
    if (defaultCharset == null) {
        synchronized (Charset.class) {
            String csn = AccessController.doPrivileged(
                new GetPropertyAction("file.encoding"));
            Charset cs = lookup(csn);
            if (cs != null)
                defaultCharset = cs;
            else
                defaultCharset = forName("UTF-8");
        }
    }
    return defaultCharset;
}

注意:
看到上面说可以通过设置系统属性file.encoding来设置默认字符集,那么有些朋友就想通过在运行时,通过System.setProperty("file.encoding", "GBK");来动态改变字符集,虽然可以通过System.setProperty("file.encoding","GBK")修改属性值,但仅仅是修改了file.encoding这个属性值,并不会影响Charset.defaultCharset()。因为jvm启动时就已经设置了Charset.defaultcharset().

作用

Charset.defaultcharset就是“操作系统编码”它会影响java 输入流、输出流默认的编码解码。
比如在StreamEncoder解码流中默认就是使用的Charset.defaultcharset()

示例一:

 // 设置JVM参数启动程序: -Dfile.encoding=UTF-8

Charset.defaultCharset();// UTF-8

String s = "哈喽YvesHe";
byte[] b = s.getBytes();// 系统默认字符集为UTF-8,等同于s.getBytes("UTF-8")
System.out.println(new String(b));// 正常,系统默认字符集UTF-8,等同于new String(b, "UTF-8")
System.out.println(new String(b, "GBK")); // 乱码,因为b以UTF-8编码,这里解码使用的是GBK

示例二:

file.encoding=utf-8,影响了Charset.defaultcharset(),从而“中”.getBytes() 3个字节
file.encoding=GBK,影响了Charset.defaultcharset(),从而“中”.getBytes() 2个字节
file.encoding=utf-16,影响了Charset.defaultcharset(),从而“中”.getBytes() 4个字节

示例三:

File file = new File("UTF-8编码");
file.createNewFile();

String charsetName = "UTF-8";
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), charsetName);
writer.write("UTF-8编码内容");
writer.close();

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
将输出文件的内容用"UTF-8"来编码,如果第二参数缺省,则默认值为Charset.defaultcharset()的值.在StreamEncoder的forOutputStreamWriter方法中可以查看.


二. file.encoding与Charset.defaultCharset()的关系?

可以通过在JVM启动时通过设置-Dfile.encoding=UTF-8来设置Charset.defaultCharset()的值.
注意: 仅在JVM启动时能指定Charset.defaultCharset()的值,在运行时通过System.setProperty("file.encoding","XXX")修改属性,仅仅是修改了file.encoding这个属性值.


三. sun.jnu.encoding与file.encoding的区别?

sun.jnu.encoding 影响文件名的创建,file.encoding 则影响到文件内容。

所以说,在我们使用 Java 处理中文文件的时候,如果发现文件的中文内容没有乱码,而文件的中文名发生乱码,我们就应当多考虑一下 sun.jnu.encoding 和 file.encoding 的区别了.
参考:http://happygiraffe.net/blog/category/uncategorized/

PS:
Java的String在内存中的编码格式是Unicode,只要在内存中内容没有乱码,对其进行编码后,采用相同的编码格式解码就能还原成原来的内容.

参考:
https://blog.csdn.net/wangjun5159/article/details/48154861 file.encoding与Charset.defaultCharset
http://www.cnblogs.com/lxzh/archive/2012/05/30/2526557.html java字符编码转换研究

猜你喜欢

转载自blog.csdn.net/u011479200/article/details/83115159
今日推荐