在Servlet中经常会遇到中文乱码问题,在这里,对常见的中文乱码的情况及解决方案作一个汇总。一般出现中文乱码的场合有显示Servlet页面,request对象获取请求参数,Servlet输出响应,以及与数据库交互时等。出现乱码主要是因为字符集编码的问题。
ASCII码
ASCII码是最早的字符集,它的全称是:American Standard Code for Information Interchange。它是美国信息交换标准码。它使用一个字节中的7位来表示一个字符(比如a、b、c等),二进制的一位有两种可能(0或者1),所以经过组合,总共可以表示128个字符(2的7次方),后来IBM使用一个字节有8位的空间,把ASCII改为由
8位表示一个字符,这样可以表示258个字符(2的8次方),
其他的字符集是在ASCII码的基础上提出来的,比如gb2312和GBK。
gb2312
gb2312编码是针对我国汉字的一套编码标准,它是最早的提出来的处理汉字信息交换的的编码标准。目前已经得到了国际标准组织以及工业标准的广泛认可。这种编码采用双字节来表示一个中文字符,这样总共能表示65536个字符,但是一级汉字只是用了3755个字符。二级汉字使用了3008个,总共最多能表示6763个字符,所以还剩
下许多空间没有使用。gb2312主要收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。
GBK
随着计算机的广泛使用,有时就需要使用一些非常偏僻的人名或者地名以及古籍字。gb2312只能表示6763个字符,不能满足日益增加的要求,所以出现了GBK编码标准。它是对gb2312的扩充,是可以向上兼容的(使用gb2312编码的字符也可以在GBK的编码标准下正确显示)。
GBK把常用的繁体字加了进来,它使得汉字数字扩展到了20902个,其编码范围是0×8140~0xfefe。目前国际标准组织以及工业界已经接受GBK标准,用它来代替gb2312。
UNICODE
UNICODE(Universal Multiple-Octet Coded Character Set)字符集编码的诞生是为了统一全球的字符编码。它是通用多八位编码字符集的简称,支持世界上超过650中预言的国际字符集。UNICODE允许在同一服务器上混合使用不同语言组的不同语言。
UNICODE标准始终使用十六进制数字,而且在书写时,在前面加上前缀“U+”,比如字母A的编码为004116,所以字母A的编码书写为“U+004116”
UNICODE标准编码的产生避免了不同字符集的冲突,解决了页面乱码的问题。现在软件开商通常的做法是:只编写一套针对UNICODE
编码标准的程序,然后把不同语言配置上不同的资源文件,使得软件可以国际化。
UTF-8
UTF-8是UNICODE的其中以个使用方式,UTF是Unicode
Translation Format,即把UNICODE转化成某种格式。UTF-8便于不同的计算机之间使用网络传输不同语言和编码的文字。使得双字节的UNICODE能够在现存的处理单字节的系统上正确传输。UTF-8使用可变长度字节来存储UNICODE字符,比如:SA汉字就要使用3个字节,辅助平面则使用4个字节。
Java的内核是Unicode的,也就是说,在程序处理字符时是用Unicode来表示字符的,但是文件和流的保存方式是使用字节流的。在Java的基本数据类型中,char是Unicode的,而byte是字节,因此,在不同的环节Java要对字节流和char进行转换。特别的,因为Java
有着良好的跨平台性,对于Java信息系统而言,将会在不同操作系统平台上编译运行。
同时Java又是根据操作系统的默认编码字符集来决定字符串的初始编码,而且Java系统的输入和输出的都是采取操作系统的默认编码。所以当运行Java程序时,如果字符集的编码选择不当,就会出现乱码问题。