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

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

一、           几种常用编码

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

二、           页面传递参数原理

    

上图的说明:

第一步:

用户填写表单信息

第二步:

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

第三步:

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

第四步:

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

三、           实例

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

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

org.apache.catalina.connector.InputBuffer

2.       类的调用关系

     

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

    

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

        

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

    

6.       Tomcatrequest默认编码设置见InputBuffer. setConverter方法

    

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

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

 

本文链接:https://my.lmcjl.com/post/13025.html

展开阅读全文

4 评论

留下您的评论.