本帖最后由 狼王 于 2013-10-6 19:40 编辑
在毕向东老师基础视频的day21中,毕老师讲了一个非常重要的知识点——编码与解码,其中就讲到了乱码的产生的原因以及解决方法,最近我在某个论坛上看到了这篇总结,觉得挺好,与大家分享一下。 1、文件乱码处理 1.1 文件默认编码 默认使用项目的默认编码
右击文件->roperties->Resource->Text file encoding 1.2 JSP文件编码 由于JSP要翻译为Servlet <%@ page language="java" pageEncoding="utf-8"%> 2 浏览器与服务器传输数据乱码处理 2.1 浏览器端编码,一般由服务器端告诉浏览器如何解码数据: 2.1.1、Servlet response.setContentType("text/html; charset=UTF-8"); 或者 response.setCharacterEncoding(“UTF-8”); 2.1.2、JSP <%@ page language="java" contentType="text/html; charset=utf-8" %> 2.1.3、通用 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 2.1.4、Javascript传参乱码 在浏览器端对要传递的中文参数进行编码处理.代码如下: //请求参数初始化
xmlhttp.open("POST",url,true); //因为请求方式为POST,所以这里要设置请求头.(如果请求方式为GET,此句代码可以省略)
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //向服务器端发送参数在服务器端代码:
xmlhttp.send("name="+encodeURI(encodeURI("星期日"))); 页面jsp保证是utf-8编码 <%@ page contentType="text/html; charset=utf-8"%> 接受中文参数
PrintWriter out = response.getWriter(); //得到response的输出流对象
String name1 = request.getParameter("name"); //得到KEY为"name"的请求参数
String name = URLDecoder.decode(name1,"utf-8"); //对得到的参数进行解码
out.print(name); //向浏览器端发送数据 2.1.5、热链接传参乱码 在传参的jsp对中文进行编码:href="new.jsp?name=java.net.URLEncoder.encode("链接")"; 在接受的jsp对中文进行转码:String str = URLDecoder.decode(request.getParameter("name "), "utf-8"); 注:浏览器编码可以由我们手工修改,但最后不要这样,一般让浏览器自动选择即可。 2.2、服务器端编码
服务器端编码,将客户端传过来的数据进行解码:浏览器默认使用ISO-8859-1进行编码数据,然后将数据传输到服务器,因此我们默认只需要将浏览器发送过来的数据转换为我们需要的编码即可。 2.2.1、最简单方式: String username = request.getParameter(“username”); username = new String(username.getBytes("ISO-8859-1“), "UTF-8"); 2.2.2、比较好的解决方案
必须在获取参数之前,调用如下方法先解码 request.setCharacterEncoding(“UTF-8”); String username = request.getParameter(“username”); 2.2.3、比较通用方案:在一个Filter中更改所有请求的编码方式: A、在src中添加filter来设置编码格式是中文,filter类可以在tomcat的包里面:apache-tomcat-6.0.16.zip\apache-tomcat-6.0.1\webapps\examples\WEB-INF\classes\filters下面,SetCharacterEncodingFilter.java文件
B、在web.xml中配置,filter,具体配置如下页: <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param><param-name>encoding</param-name> <param-value>utf-8</param-value></init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.2.4、GET提交方式中文乱码解决 通过修改request.setCharacterEncoding(“UTF-8”);只能解决POST提交方式的请求编码,对GET无效。 A、最简单解决方案:
该解决方案不再需要任何额外配置(如filter) TOMCAT默认ISO-8859-1 因此可以设置默认编码为UTF-8解决,在conf\server.xml文件中设置如下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=”UTF-8”/> B、在tomcat4之后,可以通过如下配置来解决中文乱码,但必须配置filter
在conf\server.xml文件中设置如下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI=“true”/>
然后request.setCharacterEncoding(“UTF-8”)也可解决GET乱码
|