一、第一种方法通过tomcat配置和spring编码过滤器解决中文乱码
1、修改tomcat配置文件server.xml
修改tomcat下的conf/server.xml文件 找到如下代码: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 这段代码规定了Tomcat监听HTTP请求的端口号等信息。 可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。 修改完成后: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />2、spring编码过滤器,在web.xml中配置编码过滤器
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
二、第二种方法。使用上面的配置基本可以解决问题了。但是如果没有使用springmvc不能使用编码过滤器,可以分别request和response做处理。
servlet或者springmvc的request和response的乱码问题
1、request 使用url传递中文参数(如http get)乱码问题。
//1、type如果是中文,很可能存在中文乱码问题。因为tomcat使用iso-8859-1解析中文,这样必然导致乱码。
String type = request.getParameter(Params.TYPE);
//2、对type使用utf8进行解析:将iso-88590-1编码的字符串使用utf-8进行编码
res = new String(type.getBytes("iso-8859-1"),"UTF-8");
2、response 输出中文字符串乱码
第一种方法:
//getWriter()方法将 输出编码设置成iso-8859-1,这样输出utf8编码字符串必然乱码
PrintWriter pw = response.getWriter();
//1、
//response.setCharacterEncoding("UTF-8");
//2、
response.setContentType("text/html; charset=utf-8");
pw.write(resStr);
pw.flush();
pw.close();
setContentType 和 setCharacterEncoding两方法中设定characterEncoding的方法对服务器效果一致,不需要反复调用。在输出文本内容时,采用response.setContentType("text/html; charset=utf-8");似乎更为方便。
第二种方法:
PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(), "UTF-8"));
总结:
1.在servlet中输出中文,如果采用PrintWriter方式,需要在调用getPrintWriter()之前调用setContentType 或者 setCharacterEncoding;采用ServletOutputStream方式,不受此限。
2.setContentType 和 setCharacterEncoding两方法中设定characterEncoding的方法对服务器效果一致,不需要反复调用。在输出文本内容时,采用response.setContentType("text/html; charset=utf-8");似乎更为方便。
3.PrintWriter自身并没有处理编码的职责,它还是应该看成一个装饰器比较好:它就是为了输出更方便而设计的,提供print、println、printf等便利方法。要设置编码的话,可以在它的底层Writer上设置:(这里以OutputStreamWriter为底层Writer),参考:
- new PrintWriter(new OutputStreamWriter(new FileOutputStream("yourfilepath"), "UTF-8"));