解析Java WEB中文乱码问题根源
【IT168 专稿】摘要 应用系统经常受到中文问题的困挠,J2EE环境下的中文问题更是常见。目前缺乏对此问题的全景分析,更有一些不合理的解决方案流传在网络。本文目的在于:
分析中文问题的存在根源,解析完整的中文处理过程。
中文问题涉及面很广,因为篇幅的所限,这里不会罗列各种现象的处理办法,而是就问题产生的原因进行探讨。
1. 中文乱码问题的根源
在J2EE系统的开发过程中,稀奇古怪的中文问题很多,一些运行好好的系统,修改了一个文件,或者迁移了一个平台,换了一个服务器,就变得面目全非了。为什么只有中文问题?没有英文问题?要解决中文问题,就应该从解答这个问题开始。
1. 中文有多种编码。一个中文字符,在不同的环境下,有不同的二进制值
2. 某些应用系统,会把字符串转换成其他的字符串进行传递或保存
3. 在一个完整的软件中,各种编码形式存在很多的转换
4. 每个转换过程都需要一些参数,比如“数据到底是Unicode还是GB2312的”
5. 程序员往往会忘记设置这些参数,或者错误设置
6. 不同的应用服务器或者api,其提供的设置方式经常不一样,甚至本身就是错误
7. 另外,中文问题的泛滥还得益于一种有趣的现象:当程序中有两处出现编码错误的时候,错误可以相互抵消,产生看上去似乎正确的结果,从而成为随时可能爆发的定时炸弹,同时也使得程序员对错误做法产生错误的信心。
8. 最后,由于J2EE平台的开放性,各种工具和服务器来源广泛,而这些提供者对中文的处理办法往往不尽相同,有些厂家自己都不知道中文怎么回事(他们不是中国人)。JDK和Servlet本身也不得不因为双字节字符问题而修改。这给J2EE环境下的中文问题处理又增加了难度。
2. 字符编码
这个字符串变量的值是什么?ABC,还是“中文”?实际上,计算机里面无法保存“中文”这个方块字,同样也无法保存ABC这样的字符,只能保存二进制的数据。
因此计算机必须有办法用一个二进制的编码来代表字符,由此产生了ISO8859-1编码(和ASCII码相似),用一个二进制字节来代表英文字母及其他常见的字符。