Web开发中文乱码问题汇总

来源:互联网 发布:软件系统架构师 编辑:程序博客网 时间:2024/05/16 04:24

1.POST方式

POST请求数据是通过HTTP的BODY传递数据到服务器,浏览器会根据ContentType的编码格式对参数进行编码,服务端也是通过ContentType的编码格式进行解码,所以一般不会有乱码问题,而且我们可以通过request.setCharacterEncoding(charset)进行设置。

html解码方式选择顺序:1.response中的ContentType 2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />3. 默认编码

2.GET方式

URL组成部分
浏览器对PathInfo和QueryString的编码不一样,不同浏览器对PathInfo也不同。

以Tomcat为例,对URI解码的字符集在<Connector port="8080" protocol="HTTP/1.1"/>中定义,默认是ISO-8859-1,因此,如果URI中如果包含中文,最好把URIEncoding设置成UTF-8,当然还需要设置QueryString为ContentType的字符集,即设置useBodyEncodingForURI为TRUE,如<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>

对于在HEADER中传递其他参数,如Cookie,redirectPath,Tomcat是通过默认解码方式:ISO-8859-1,而且我们不能设置其他解码方式,因此如果Header包含非ASCII字符,会乱码,我们需要进行encodeURI(),然后进行传递,访问时再相应的解码。

注意:在myeclipse中run as server,会用myeclipse自带的配置
eclipse server.xml

3.JS的编码

不同浏览器对js的url编码不同,甚至不同js框架对其url处理也不同。
对于这个问题需要了解两个方法:

1.encodeURI
对整个URL进行UTF编码(ASCII字符和一些特殊符号除外,如&,?,#等),在每个码值前加“%”

2.encodeURIComponent
比encodeURI编码更彻底,对整个URL进行UTF编码(ASCII字符除外,&,?,#等都会进行编码),常用语将一个URL作为另一个URL的参数进行传递

注意:js的encodeURI默认是UTF-8编码,而java对中文默认是GBK编码,这种时候的解决办法是encodeURI或者encodeURIComponent两次编码,request.getParameter()通过GBK解码,如果需要获取该字符串,再进行UTF-8解码(URLDecoder.decode(str,”UTF-8”))即可。

如果已经设置URIEncoding=”UTF-8” useBodyEncodingForURI=”true” 则不需要进行encodeURI两次编码

附加:进行两次encodeURI,第一次编码得到的是UTF-8形式的URL,第二次编码得到的依然是UTF-8形式的URL,但是在效果上相当于首先进行了一次UTF-8编码(此时已经全部转换为ASCII字符),再进行了一次iso-8859-1编码,因为对英文字符来说UTF-8编码和ISO-8859-1编码的效果相同。在服务器端,首先通过request.getParameter()自动进行第一次解码(可能是gb2312,gbk,utf-8,iso-8859-1等字符集,对结果无影响)得到ascii字符,然后再使用UTF-8进行第二次解码,通常使用URLDecoder.decode(str,”UTF-8”)方法。

两次编码两次解码的过程为:

UTF-8编码->UTF-8(iso-8859-1)编码->iso-8859-1解码->UTF-8解码,编码和解码的过程是对称的,所以不会出现乱码。

0 0
原创粉丝点击