java的默认编码
比如String.getBytes()就调用的默认编码,流程如下:
会先获取默认编码:String csn = Charset.defaultCharset().name();
如果默认编码有异常则使用:"ISO-8859-1"
那么默认编码如何获取?看了下源码如下
The default charset is determined during virtual-machine startup and typically depends upon the locale and charset of the underlying operating system.
默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统的区域设置和字符集。
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
String csn = AccessController.doPrivileged(new GetPropertyAction("file.encoding"));//系统属性file.encoding设置的编码
Charset cs = lookup(csn);
if (cs != null)
defaultCharset = cs;
else
defaultCharset = forName("UTF-8");//得不到系统设置的编码则用UTF-8
}
}
return defaultCharset;
}
file.encoding 设置(运行时可设置):
在命令行中输入 java,在给出的提示中会出现 -D 的说明:
-D= # set a system property
-D后面需要跟一个键值对,作用是设置一项系统属性
对 -Dfile.encoding=UTF-8 来说就是设置系统属性 file.encoding 为 UTF-8
其实就是文件的编码
java默认编码理解总结:
先看file.encoding设置的编码(eclipse运行时候,为了不乱码会以文件编码运行)
如果没有设置的编码则用"UTF-8"
如果设置的编码不可用则用"ISO-8859-1"
注意点:
我们的电脑系统一般都是默认的GBK编码,如果cmd命令编译默认都用GBK。
编译编码(编译用编码和文件编码一致,不然会编译不通过,我猜可能是为了防止编译乱码):javac -encoding UTF-8 Test.java
运行编码(也就是defaultCharset,java会程序用的默认编码)java -Dfile.encoding=utf-8 Test
编译编码和运行编码之间没有必要联系。编译编码(必须和文件一致,保证文件的正确编译),执行编码(为java程序(JRE)设定默认编码)。这也是为什么jar包里的class代码无论在什么编码下都可执行
在使用eclipse混合文件编码时也可编译执行,原因:个人认为eclipse等开发环境会默认使用文件编码格式编译,文件(程序入库的文件)编码格式运行(因为运行的是main()方法,main()可以多个,但程序入口就一个)
在服务器上运行时,不会和eclipse一样自动设置,固最好配置执行编码