java的默认编码方案是什么?

通常我们需要这样做,

public static void main(String[] args) {
    String s="中国";
    byte[] bytes = s.getBytes();
    String s2 = new String(bytes);
}

那么将unicode字符串转为字节数组或者将字节数组转为字符串是按照什么编码呢?

在java中获取编码方案,

 public static void main(String[] args) {
	//方法一
	System.out.println(System.getProperty("file.encoding"));
	//方法二
	System.out.println(Charset.defaultCharset());
}

再进入defaultCharset方法,

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属性,并通过该属性查找到了对应的Charset对象,如果找不到该属性所对应的Charset,就默认返回utf-8(所有Charset名字的参数均大小写等价)Charset。说明在值合理的情况下,file.encoding属性确实决定了所谓的默认编码。


知道了作用,并且作用不小,那我们来看看到底是什么决定了file.encoding属性。

创建一个简单的java类,

public class Test {

    public static void main(String[] args) {
        //方法一
        System.out.println(System.getProperty("file.encoding"));
        //方法二
        System.out.println(Charset.defaultCharset());
    }
    
}

使用javac编译,然后使用java运行。

第一次不指定file.encoding

wKiom1hwiayzh1DYAAAPrWwG0X4651.jpg

可以看出java使用了操作系统默认的编码方案。

第二次指定file.encoding=utf-8

wKioL1hwievzH7auAAATHAqQkzM866.jpg

可以看出默认编码方案改为了utf-8

第三次指定一个不存在的编码,file.encoding=aaa

wKiom1hwikGg4MJAAAATunlZQrI447.jpg


结论:由上边可以看出java默认编码方案主要是由-Dfile.encoding来控制,如果没有指定那么就使用系统默认编码方案,如果指定但是不存在那么使用utf-8编码。