1.字符集编码
JDK1.6APi中提供的字符串构造方法有指定编码字符集和系统默认编码字符集两类。对于指定编码字符集来说,很好理解。默认编码字符集中描述如下:
Constructs a new String by decoding the specified array of bytes using the platform's default charset.
没有指定字符编码的字符串会按照“平台默认编码”进行构造。这里的平台是指运行时的jvm环境。
平台默认的编码可以通过以下方式获取:Charset.defaultCharset()。改方法内容如下:
<!-- lang: java -->
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
java.security.PrivilegedAction pa =
new GetPropertyAction("file.encoding");
String csn = (String)AccessController.doPrivileged(pa);
Charset cs = lookup(csn);
if (cs != null)
defaultCharset = cs;
else
defaultCharset = forName("UTF-8");
}
}
return defaultCharset;
}
这里的defaultCharset指定的编码就是不指定编码格式时创建字符串的编码。defaultCharset的值是根据环境变量"file.encoding"获取。可以通过设置将JVM启动参数: -Dfile.encoding=GBK的方式来指定默认编码。当file.encoding参数没有设置时,jvm会获取当前操作系统的默认编码作为jvm默认编码。
在java程序中可以通过System.setProperty("file.encoding", "GBK")修改该参数的值,但修改的编码不会改变Charset.defaultCharset()的取值。因为defaultCharset定义如下:
private static volatile Charset defaultCharset;
修改某个字符串编码方式如下:
String str = "字符"; String newStr = new String(str.getBytes("gbk"), "gbk");直接使用String newStr = new String(str.getBytes(), "gbk");当默认编码格式不是gbk时会产生乱码。
2.输入输出流编码
操作同一个文件时,写文件使用的编码必须和读文件使用的编码一致。
在java.io包中操作流的工具类在没有指定编码时都使用了“平台默认编码”,如果该默认编码与创建文件时的编码不一致,读入的中文将会乱码,英文不乱码。