java web乱码及解决方法
一、中文乱码说明
在Java Web项目中,由于pageEncoding、contentType和charset等编码属性的设置不恰当往往导致显示中文字符会出现乱码问题。例如,在Java Web项目的代码采用UTF-8进行编码,而在浏览器使用ISO-8859-1进行编码,因此会产生中文乱码问题。
二、相关知识
1.JSP中pageEncoding、contentType以及contentType的charset的理解与区别:
1)pageEncoing:设置JSP源文件本身和响应正文中的字符集编码;
2)contentType:设置JSP原文建和响应正文中的字符集编码以及MIME类型;
3)charset:设置服务器发送给客服端时的内容的字符集编码。
2.在Java Web项目中,通常情况下,产生中文乱码有三种情况:
第一种情况:调用JSP页面时产生中文乱码;
第二种情况:调用Servlet页面时产生中文乱码;
第三种情况:通过post请求传递包含中文字符的表单时出现中文乱码。
3.几种常见的编码格式:
1)ISO-8859-1:属于单字节编码,最多能表示字符范围为0-255,应用于英文系列;
2)GB2312/GBK:是汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和ISO-8859-1一致。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字,GBK是兼容GB2312编码;
3)UTF-8:是一种用以解决国际上字符的多字节编码,它对英文使用一个字节,对中文使用三个字节进行编码,是国际上比较通用的字符编码。
解决方案
解决思路:根本上就是使编码保持一致,即:
1、JSP的字符编码格式。(JSP页面的头部添加<%@page contentType="text/html"pageEncoding="UTF-8"%>或者将pageEncoding中的值改为UTF-8)
2、Request的字符编码格式。
1)(request.setCharacterEncoding( UTF-8));
2)spring的字符集过滤器org.springframework.web.filter.CharacterEncodingFilter配置,如:
<filter> <description>字符集过滤器</description> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <description>字符集编码</description> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter>
但以上方法只对post 有效,而当HTTP请求以GET方式发出时,请求参数位于请求头的URI中。过滤器只对请求体中的内容编码,而请求头不编码,Tomcat对于GET请求会使用iso-8859-1编码(tomcat默认编码)。
get请求
1、修改tomcat的编码
<Connector port="9300" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
2、但有时需要根据文档调用第三方接口。这时可以采用。
new String(key.getBytes("iso8859-1"), "utf-8");
3、在客户端使用 URLEncoder.encode(“中文”,”UTF-8”)对中文参数进行编码,在服务器端需要进行解码this.setName(java.net.URLDecoder.decode(name, “UTF-8”));