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方式
浏览器对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自带的配置
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解码,编码和解码的过程是对称的,所以不会出现乱码。
- web开发中,中文乱码问题汇总
- Web开发中文乱码问题汇总
- Web开发中文乱码问题汇总
- Web开发中文乱码问题
- 中文乱码问题汇总
- web开发中文乱码问题总结
- Java Web开发中文乱码问题
- web开发中的中文乱码问题
- 关于web开发的中文乱码问题
- web开发 解决中文乱码问题
- Web开发中中文乱码的问题
- 浅析WEB开发中的中文乱码问题
- WEB开发保存数据中文乱码问题
- Java web 开发中文乱码问题
- web开发中文乱码问题及解决方案
- web应用开发中中文乱码问题
- web 开发中的中文乱码问题
- web中文乱码问题
- SCALA FUNCTION STYLE
- Problem C: 整数的封装
- scheduledTimerWithTimeInterval与timerWithTimeInterval的区别
- “两两”求和问题技巧
- 自定义对象创建的三种方式
- Web开发中文乱码问题汇总
- bzoj 3999: [TJOI2015]旅游 树链剖分+线段树
- 时间的加减计算
- ios ipv6 审核被拒通过办法,实测。
- 程序员如何自我学习与成长?
- js判断页面是否加载完成
- 关于docker部署,结合java项目一起研究
- 数值分解 (sdut oj)
- 莫比乌斯函数和莫比乌斯反演