为什么页面接收到的中文是乱码?

在开发中,我们也许会遇到在页面之间传递参数的时候,传递因为参数是没有什么问题的,但是传递中文参数缺是乱码,本文大致讲解下一些关于中文乱码的一些问题。

一、           几种常用编码

1.       ASCII编码

产生目的:解决英文字符与二进制位之间的对应关系

原理:由于计算机中的所有信息都是采用二进制位(bit)表示的字符串,一个字节(byte)由8个二进制位组成,所以最多可以表示256个英文字符。由于ASCII码只有128个字符,所以只用一个字节的后边7位已经足够,最前面的1位统一用0表示。

字符个数:128个

2.       ISO-8859-1编码

产生目的:解决ASCII码在不同国家不够用的情况,是一个单字节编码(该编码是JAVA网络传输使用的标准字符集,)

原理:对于ASCII编码剩下的最前面的1位进行编码,所以个数是ASCII码的2倍,也就是256个

字符个数:256个

3.       GB2312编码

产生目的:中华人民共和国国家汉字信息交换用编码,主要是我国为了表示汉字而颁发的一种编码

字符个数: 7445个(汉字6763个)

4.       GBK编码

产生目的:由于GB2312编码支持的汉字只能有6763个,为了支持能够支持更多的汉字而开发的一种编码,支持GB2312编码的6763个字符。(也就是GB2312编码的扩充)

字符个数:21886个(汉字20902个)

5.       UTF-8编码

产生目的:是Unicode编码的一种编码方式,为了解决能够表达全球不同国家的不同字符,在不同国家打开同一文件不再是乱码。

原理:采用8位序列来编码,用一个字节或者几个字节来表示一个字符。UTF-8是一种变长的编码方式,一个字符的长度为1-4个字节。

6.       其他

UTF-16和UTF-32也是unicode的2中不同编码方式,他们分别是采用16位和32位的序列来编码,通常说的Unicode编码指的是UTF-16。由于在HTML4中已经能够很好的支持UTF-8了,所以现在因特网的编码方式首选还是UTF-8。

二、           页面传递参数原理

     http请求过程

上图的说明:

第一步:

用户填写表单信息

第二步:

IE对用户填写的表单信息进行编码,优先采用IE的设置,其次采用contentType的值进行编码(IE默认采用UTF-8编码)

第三步:

         应用服务器根据request对象上设置的characterEncoding的值对request中获取到的值进行解码(Tomcat服务器默认是ISO-8859-1),

第四步:

         在页面中接收参数,调用request.getParameter(“ParamName”)方法获取参数值

三、           实例

四、           Tomcat应用服务器传递参数解

1.       server.xml中Connect节点监听的线程从request中 获取数据的类

org.apache.catalina.connector.InputBuffer

2.       类的调用关系

      类的调用关系

3.     看看org.apache.catalina.connector.Request的parseParameters方法

     org.apache.catalina.connector.Request的parseParameters方法

4.       再来看看org.apache.tomcat.util.http.Parameters的addParam的调用过程

         org.apache.tomcat.util.http.Parameters的addParam方法

5.        addParam的时候参数是已经编码,具体的编码跟踪之后可以确定是跟charsetEncoding有关,下图是调用在方法:org.apache.tomcat.util.http.Parameters的processParameters方法

     org.apache.tomcat.util.http.Parameters的processParameters方法,addParam的时候是已经编码之后的

6.       Tomcat的request默认编码设置见InputBuffer. setConverter方法

     setConverter的代码

7.       为什么接受中文是乱码?

在上图中,当我们第二步采用的编码是UTF-8,如果我们没有指定request.setCharacterEncoding()的值,那么在第三步Tomcat应用服务器采用默认的iso-8859-1进行解码,这样导致编码和解码不一致,所以读取中文的时候是乱码了。

转载于:(http://blog.csdn.net/wgw335363240/article/details/6059489)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值