版权归原作者所有,如有侵权,请联系我们

[科普中国]-乱码

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

乱码,指的是由于本地计算机在用文本编辑器打开源文件时,使用了不相应字符集而造成部分或所有字符无法被阅读的一系列字符。造成其结果的原因是多种多样的。

简介种类汉字乱码现象有4种类型:

文本乱码:是Windows系统显示乱码,如:菜单、桌面、提示框等。这是由于注册表中有关字体部分的设置不当引起的;

文档乱码:是可执行文件本来显示中文的地方出现乱码。这种乱码形成的原因比较复杂,有第1类的乱码原因,也可能是软件中用到的中文动态链接库被英文动态链接库覆盖所造成的;

文件乱码:主要是指邮件乱码;

网页乱码:是由于港澳的繁体中文大五码(BIG5)与大陆简体中文(GB2312)不通用而造成的。

修正乱码,可以使用系统内码转换工具,如“南极星”等,将系统内码转换为对应内码,字符即可正确显示。

原因一般是软件程序解码错误。如浏览器把GBK码当成是Big5码显示,或电子邮件程序把对方传来的邮件错误解码。如果在发送时编码错误,收件者的电邮程序是不能解码的,需要寄件者的电邮程序重新编码再寄。字体档案(font file)不对。来源编码错误,或文件受到破坏。

一种语言版本的操作系统安装了另外一种语言版本的应用程序,或者应用程序安装的升级补丁的语言版本与应用程序原来安装的语言版本不一致。

早期单字节的应用程序在打开双字节语言的文件时不能正确识别文字的分割,在换行的地方把一个字从中分成两段,导致紧接在后面的整个一行全部都是乱码。

低版本的应用程序不能识别高版本的程序创建的文件。

由于TXD等修改文件出现内部冲突,一些修改游戏的MOD(modification)CLEO、IV补丁、真实补丁、技能补丁、升级补丁和CCI人物补丁等游戏修改软件的“Readme”“必看!”等阅读文件会出现乱码。

电脑软件的错误操作也会导致整个文件出现乱码

数据库原因

数据正确,但数据库配置错误,使用了错误的字符集。一般是数据库移植,还原时DBA的错误造成的。

一般是客户端使用了默认的字符集,比如在GBK的机器上开发,但换到Linux下面就出现读取的数据为乱码了。

解决方法是:在连接参数里面明确指定数据传输用的字符集,而不是使用操作系统默认的。

数据错误。一般是客户端发来的数据编码问题。比如页面发送数据是UTF-8,可是后台处理程序是GBK的,结果造成保存到数据库的数据为乱码。

解决方法:所有字符集编码都采用统一的编码。比如全部用GBK的。1

相关资料避免乱码1.尽量使用统一的编码,如果你是重头开发一个系统,特别是Java开发的,推荐从页面到数据库再到配置文件都使用UTF-8进行编码,安全第一。

2.SetCharacterEncodingFilter的使用,这个东西不是万能的,但是没有它就会很麻烦,如果是基于Servlet开发的东西,能用的就给它用上,省心。不过有一个注意的地方,这个Filter只是对POST请求有效,GET一律忽略,不信你可以debug一下,看看它怎么做的,至于为什么不过滤get请求,好象是它对GET请求是无能为力的。

3.就如上面所说,GET请求有问题,尽量使用POST请求,这个也是Web开发的一个基本要领:

4.JavaScript和Ajax乱码的避免,注意JavaScript默认是ISO8859的编码,避免JS/AJAX乱码和GET一样,不要在URL里面使用中文,实在避免不了,就只能在生成链接的时候转码。

5.尽早统一开发环境,早点模拟真实环境测试,这个好像也有跑题的嫌疑,但凡软件开发都是这么干的,但仍然值得注意。

应对措施1.开发环境乱码

由于Java默认使用UTF-8编码,而且网上很多人都建议Struts开发的时候应尽量选用UTF-8做为默认编码,而非GBK。IDE使 用Eclipse,在第一次使用Eclipse的时候应将default text editor改为UTF-8编码。

2.POST请求的过滤

这个是最基本的了,每个Servlet系统基本都会用到这个东西。不过只对POST请求有效,这个挺关键的。使用SetCharacterEncodingFilter,这个很基础的一套过滤器,将所有来自页面的POST请求全部过滤为UTF-8编码。

3. JSP 页面乱码

将JSP页面全部改为charset=UTF-8,这样可以保证与后台交互的时候都是UTF-8编码,一般应用做了以上工作就基本可以应付了。

4.资源文件中汉字转化UTF-8字符问题

国际化问题,在使用资源文件的时候,由于中文在properties文件中无法被程序所识别,需要将其进行转码,我在资源文件下面制作了一个很简单的 bat文件,每次修改资源文件的时候都是在一个临时文件中修改,然后执行这个bat文件,将其转化并保存为所需要的资源文件。

5. GET请求乱码

如果在本项目中采用了get方式提交请求并附加参数,结果导致编码乱码,原因是Tomcat默认请求编码是ISO8859,需要在Tomcat的配置文件 server.xml添加一个参数,URIEncoding=”UTF-8”,这样请求中附件的参数就会以UTF-8来进行编码。2

本词条内容贡献者为:

杜强 - 高级工程师 - 中国科学院工程热物理研究所