加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

linux(centos7)下程序中文输出乱码问题的解决

(2017-09-28 17:34:14)
分类: 软件
目前的程序代码都是在window编写,编码格式为GBK。转移到linux下,编译正常,在控制台运行时中文输出为乱码。查linux的LANG发现为UTF-8,于是修改为GBK。再次运行程序,依然为乱码。百思不得其解,查各种资料,也都是在LANG等各种配置上解决,可我已经修改了,而且桌面、菜单上的中文都显示正常。问题出现在哪里?灵感来了挡不住,我突然想可能是控制台本身是否有编码配置呢?检查终端控制台的菜单项,果然有一个编码项,其设置的正好为UTF-8.修改为GBK以后,再次运行程序,中文输出正常。

在为解决上述问题查资料的过程中,发现有位同学提了一个这样的问题:
CharSetTest.java文件内容如下,在Windows下编译为class文件。
import java.nio.charset.Charset;
import java.io.OutputStreamWriter;
import java.io.ByteArrayOutputStream;
public class CharSetTest {

    public static void main(String[] args) {
        System.out.println("Default Charset=" + Charset.defaultCharset());
        System.setProperty("file.encoding", "Latin-1");
        System.out.println("file.encoding=" + System.getProperty("file.encoding"));
        System.out.println("Default Charset=" + Charset.defaultCharset());
        System.out.println("Default Charset in Use=" + getDefaultCharSet());
        System.out.println("Default 字符集(在使用中的)=" + getDefaultCharSet());
    }

    private static String getDefaultCharSet() {
        OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
        String enc = writer.getEncoding();
        return enc;
    }
}

首先在本地Windows上运行:
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe CharSetTest
Default Charset=GBK
file.encoding=Latin-1
Default Charset=GBK
Default Charset in Use=GBK
Default 字符集(在使用中的)=GBK
 
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe -Dfile.encoding=GBK CharSetTest
Default Charset=GBK
file.encoding=Latin-1
Default Charset=GBK
Default Charset in Use=GBK
Default 字符集(在使用中的)=GBK
 
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe -Dfile.encoding=UTF-8 CharSetTest
Default Charset=UTF-8
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=UTF8
Default 瀛楃闆嗭紙鍦ㄤ娇鐢ㄤ腑鐨勶級=UTF8
 
这个结果符合预期,因为文件本身是GBK编码的,使用UTF-8运行会出现乱码,但这个class文件ftp到Linux下运行的结果就比较奇怪了:
/opt/jdk1.6.0_35/bin/java CharSetTest
Default Charset=UTF-8
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=UTF8
Default 字符集(在使用中的)=UTF8
 
/opt/jdk1.6.0_35/bin/java -Dfile.encoding=GBK CharSetTest
Default Charset=GBK
file.encoding=Latin-1
Default Charset=GBK
Default Charset in Use=GBK
Default ؖ·՚ʹԃאµģ©=GBK
 
/opt/jdk1.6.0_35/bin/java -Dfile.encoding=UTF-8 CharSetTest
Default Charset=UTF-8
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=UTF8
Default 字符集(在使用中的)=UTF8
 
为什么指定为GBK会出现乱码,使用UTF-8反而不会?
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
针对这个问题,网上好多同学都议论纷纷,可都没有说对重点。要想自己的眼睛看到是中文,重点在这里:
1、内容以什么编码格式保存。
2、程序以什么编码格式输出内容?
3、显示界面以什么编码格式显示内容?
回到这位同学的问题,不管java文件是什么编码格式,但最终class文件都是unicode格式存储。
ChartSetTest运行时按照指定的字符集输出字符。这里的显示程序其实就是控制台。
1、在window情况下,控制台默认输出是gbk码。操作系统的默认编码也是gbk。
       所以在运行程序时不指定编码以及指定编码为gbk。中文输出都正常。但是指定编码为utf8时,
       则程序则会输出utf8字符,但控制台则会以gbk显示,结果出现乱码。
2、在linux下。控制台和操作系统的编码默认都是utf。
      所以在运行程序时不指定编码以及指定编码为utf8。中文输出都正常。但是指定编码为gbk时,
       则程序则会输出gbk字符,但控制台则会以utf8显示,结果出现乱码。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有