天天看点

彻底搞定JAVA乱码问题来龙去脉

作者:百思大脑软件开发
彻底搞定JAVA乱码问题来龙去脉

从此不再乱码

在从事JAVA软件程序开发过程中之所以遇到乱码,问题根本原因是解码和编码不一致造成的,比如将某字符串采用utf8编码存入txt,但是读出时却采用gbk,那么打印字符串时输出肯定是会出现乱码的。这个根本原因可能很多人都清楚,编写程序时可能也会指定编码写入和读出,但是还是少不了会遇到乱码问题,遇到时可能还会花不少时间解决。

彻底搞定JAVA乱码问题来龙去脉

乱码根本原因是编码解码不一致

本人最近就又因乱码栽了跟头,从10多年前入门java时便遇到过乱码问题,经过多年摸爬滚打,自认为对编码理解算是透彻了,没想到最近交付软件乱码竟然花了我大部分时间。交付客户的软件在我们本机已经测试多次,中文一直显示都非常正常,客户却说乱码,最后远程过去看了确实是乱码。又换2了台电脑时,我们仍然没有重现,最后没办法,还是老老实实检查代码,发现确实有个地方漏了指定编码,有潜在风险,至此花费时间还不算太多,但是奇怪的是给客户新版本,客户仍然坚持说乱码。埋头看代码,已经不可能发生的了,不可能了,不可能了,但是...。一遍一遍又看了多遍代码,真的不可能发生乱码了。最后我只能怀疑客户用错版本了,由于客户已经下班了,所以也没办法远程亲自试下。

彻底搞定JAVA乱码问题来龙去脉

破除乱码

感觉自己有点强迫症还是说责任心过头了,由于此次软件交付正好赶在了3天假期前,存在一点点问题,总像个石头压着心头,放松不得。于是又一遍遍捋下中文文字内容从存储文件中,加载到jvm内存,直到显示在界面一步步的过程,其实也只有2个关键位置,一时文件存储编码格式,一时读取时才有的解码格式,这2个地方我均采用确定的“utf8”,所以不可能再产生乱码。最后终于能99.9999%证明是客户的问题了,才算是放下心来。

最后整体总结下乱码相关编码点:

1.FileReader/FileWriter/Scanner,生成时需要指定,不指定使用系统默认编码,这样容易产生乱码,建议指定,本次栽跟头就是因为几处读写都指定了utf8,只有一处new Scanner是未指定导致[笑哭]惨痛教训铭记[敲打]。

2.jvm内存中变量值均采用unicode编码,比如“岳”字unicode编码为5cb3,当程序中定义一个字符串变量值为“岳”时,内存中是通过unicode静态编码表映射为5cb3的。

3.文件中编码,当在程序中定义中文字符串常量时,他们会随和文件采用相同编码进行保存,但是如果采用javac命令行进行编译时,一般都需要指定-encoding utf-8,否则会采用命令行默认编码,这时如果文件编码和命令行编码不一致便会出现编译失败或者中文乱码情况。

4.参数file.encoding,这个参数是用于修改IO读取和写入字符时所采用的默认编码的,不建议修改,但是这里容易遇到坑,所以在软件开发过程中需要留意。

彻底搞定JAVA乱码问题来龙去脉

软件开发乱码终破除

继续阅读