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

This article is posted by on , link is .

Leave a reply