Java 中文乱码解决方法整理
如果你的操作系统是windows,那么先参看 这篇文章,看是否可以解决你的问题:
http://developer.51cto.com/art/200708/53612.htm
后来有搜索到了一篇更为精辟的文章,说明了java乱码的原理:
http://fishermen.javaeye.com/blog/31896
但是今天我遇到的问题就不仅仅如此了,虽然原理是上面提到的 从 byte->char 转换失败。
项目使用的编码为GBK, 我使用的操作系统为 Ubuntu 9.10,默认使用的编码为 UTF8, 并且使用的是英文的操作系统。
经过google, 以及跟踪发现, 是从 文件中读取出来的 InputStream 转换到 Writer的时候出错了, 在这儿使用 IOUtils 中的copy 方法,而没有特别指定 编码,所以系统使用了默认的编码, 经过搜索和研究,发现系统的默认编码采用 System.getProperty("file.encoding") 获取, 于是写了个简单的例子,输出 file.encoding的值,根本不是 GBK, 虽然我在运行之前已经 export LANG=zh_CN.GBK。
后来在 wxz 的指点下,检查了一下系统的 locale 设置(运行: locale -a),这才发现, 原来系统就根本没有安装 zh_CN.GBK, 那 当然运行java的时候 file.encoding也不会被设置为GBK了, 运行 sudo locale-gen zh_CN.GBK 后, export LANG=zh_CN.GBK, 再运行测试程序,终于打印出了 GBK, 这个时候再运行项目的程序的时候,果然没有乱码了。
搞定!
相关的测试代码如下:
# sudo locale-gen zh_CN.GBK之前:
guoxiaod@guoxiaod>cat t.java
class t
{
public static void main(String[]args) {
System.out.println(System.getProperty("file.encoding"));
}
}
guoxiaod@guoxiaod>javac t.java
guoxiaod@guoxiaod>java t
UTF-8
guoxiaod@guoxiaod>export LANG=zh_CN.GBK
guoxiaod@guoxiaod>java t
ANSI_X3.4-1968
# sudo locale-gen zh_CN.GBK 之后
guoxiaod@guoxiaod>cat t.java
class t
{
public static void main(String[]args) {
System.out.println(System.getProperty("file.encoding"));
}
}
guoxiaod@guoxiaod>javac t.java
guoxiaod@guoxiaod>java t
UTF-8
guoxiaod@guoxiaod>export LANG=zh_CN.GBK
guoxiaod@guoxiaod>java t
GBK