解决中文乱码的问题
在Servlet中经常会遇到中文乱码的问题,在这里,对常见的中文乱码的情况进行汇总。一般的,出现中文乱码的场合有显示Servlet页面,request对象的获取请求参数,Servlet输出响应以及数据库交互等,另外,出现乱码主要是因为字符集编码的问题。
字符集的介绍
ASCLL码
这是最早的字符集,它使用一个字节中的7位来表示一个字符,经过组合,总共可以表示128个字符,后来IBM使用一个字节有8位的空间,把ASCLL改为由8位表示的一个字符,这样可以表示258个字符,其他的字符是在ASCLL码的表示的基础下提出来的。
gb2312
gb2312是针对我国的汉字的一套编码标准,他是最在提出来的处理汉字信息交换的编码标准,这种编码采用双字节来表示一个中文字符,总共最多能表示65536个字符。
GBK
这是对gb2312的补充,是可以向上兼容的(使用gb2312也可以在GBK编码标准下正确显示)
UNICODE
这个编码的诞生是为了统一的全球编码,它是通用多8位编码字符集的简称,支持世界上超过650种语言的国际字符集。UNICODE始终允许在同一服务器上混合使用不同的语言组的不同的语言。UNICODE始终使用16进制的数字,而且在书写时,在前面加上”U+”.例如,字母A的编码为004116,所以字母A的编码为”U+004116”
UTF-8
UTF-8是UNICODE的其中一个使用方式,全称为Unicode Translation Format,即把UNICODE转化为某种格式。UTF-8便于使用不同的计算机之间使用网络传输不同语言和编码的文字,使得双字节的UNICODE能够在单字节的处理系统上正确传输,UTF-8使用可变长度字节来存储UNICODE字符。
出现中文乱码的原因
Java的内核是UNICODE的,也就是说,java在处理字符时是用Unicode来表示字符的,但是文件和流的保存方式是使用字节流的,在java中,char是Unicode的,而byte是字节的,因此,在不同的环境里面,java要对字节流和char进行转换,因为java有着良好的跨平台性,对于java信息而言,将会在不同的操作系统平台上编译运行。
同时,java又是根据操作系统的默认编码字符集来决定字符串的初始编码,而且java的系统的输入和输出都是采取操作系统的默认编码,所以,当java运行的时候,如果字符集的编码选取不当,就会出现乱码的问题。