最近发现一个问题, 中文编码保存到数据库里显示正确, 打印出来却是一串问号, 然后怀疑是平台默认编码的问题, locale命令显示是UTF-8正常, 然后单独编写一个java文件, 编译然后Java命令执行显示也很正常, 唯独在这个系统里打印出来是乱码。 然后怀疑还有其他的编码影响, 经过一番查找, 发现这两个代码:
System.out.println("file.encoding");
System.out.println(Charset.defaultCharset());
输出结果:
ANSI
ASCII
说明不是UTF-8,然后在系统里手动设置System.setEnv("file.encoding", "UTF-8");
,然后file.encoding
属性打印出来是UTF-8没错, 但是Charset.defaultCharset()
还是ASCII。
然后再查找一番, 发现stackoverflow上的一个答案, 他指出file.encoding
属性必须在jvm启动的时候指定, 因为进入main方法的时候系统使用的默认编码已经被缓存了, 所以在系统里手动set编码是没用的。因此在启动时加上编码参数:
java -Dfile.encoding=UTF-8 …
然后中文打印出来正常。
另外,Charset.defaultCharset()
的值是和file.encoding
属性对应的。
https://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding