request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码;
对于response乱码,只需要在服务器端指定一个编码字符集,然后通知浏览器按照这个字符集进行解码就可以了。
2、response.setContentType("text/html;charset=utf-8”);//等同于response.setHeader("contentType", "text/html; charset=utf-8”);
3、response.setCharacterEncoding("utf-8”);//设置服务器端的编码为utf-8
response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);//要求浏览器使用utf-8进行解码
可以看出,第二种方式是最简便的,这也是我们在开发中最常使用的方式。
从浏览器发起的访问方式有三种:在地址栏直接输入URL访问、点击页面中的超链接访问、提交表单访问。
例如:
response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码;
一、乱码产生的原因
不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的。
以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器之间的通信实质上是socket流,所以要先将请求参数(字符)转换成字节,也就是编码过程,服务器接收到请求参数后进行解码(字节转字符),然后封装到request对象中。如果客户端的编码与服务器端的解码不统一,就会导致通过request获取到的请求参数的值是乱码。
二、乱码分类及解决方案
(一)、response乱码
服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。对于response乱码,只需要在服务器端指定一个编码字符集,然后通知浏览器按照这个字符集进行解码就可以了。
有三种方式:
1、response.setCharacterEncoding("utf-8”);//设置服务器端的编码,默认是ISO-8859-1;该方法必须在response.getWriter()之前进行设置
response.setHeader("contentType", "text/html; charset=utf-8”);//通知浏览器服务器发送的数据格式是text/html,并要求浏览器使用utf-8进行解码。
1、response.setCharacterEncoding("utf-8”);//设置服务器端的编码,默认是ISO-8859-1;该方法必须在response.getWriter()之前进行设置
response.setHeader("contentType", "text/html; charset=utf-8”);//通知浏览器服务器发送的数据格式是text/html,并要求浏览器使用utf-8进行解码。
2、response.setContentType("text/html;charset=utf-8”);//等同于response.setHeader("contentType", "text/html; charset=utf-8”);
而且,它会覆盖response.setCharacterEncoding("utf-8”) ,
在开发中只需要设置response.setContentType("text/html;charset=utf-8”)就可以了。意思是通知浏览器服务器发送的数据格式是text/html,服务器采用utf-8编码,并要求浏览器使用utf-8进行解码。
3、response.setCharacterEncoding("utf-8”);//设置服务器端的编码为utf-8
response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);//要求浏览器使用utf-8进行解码
可以看出,第二种方式是最简便的,这也是我们在开发中最常使用的方式。
(二)、request乱码
从浏览器发起的访问方式有三种:在地址栏直接输入URL访问、点击页面中的超链接访问、提交表单访问。
【
在服务器端,通过request.setCharacterEncoding("XXX”)即可设置服务器的解码为XXX(默认是ISO-8859-1)。
只要服务器的解码字符集和请求参数的编码字符集一致,就不会产生乱码】
1、post方式:表单提交
post方式属于表单提交,参数存在于请求体中,
其编码方式和 <%@ page language="java" contentType="text/html;charset=UTF-8"
pageEncoding="GBK%> 中的charset=UTF-8的编码方式一致。
pageEncoding="GBK%> 中的charset=UTF-8的编码方式一致。
通过request.setCharacterEncoding("UTF-8”)即可解决乱码。
2、get方式:超链接、在地址栏输入URL
get方式提交的参数会跟在请求行中的uri后边,服务器按照默认的iso-8859-1进行解码(注意:是服务器对URI参数进行编码,且一律采用ISO8859-1进行解码),
这时候解决乱码有两种办法:
·办法一:修改服务器端对uri参数的默认编码
在tomcat的server.xml中,
(1)设置<Connector ….>元素的属性URIEncoding="UTF-8”即可。(默认没有设置此属性),指定URI使用“UTF-8”编码方式。
注意:其要求 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="GBK" %> 中的charset的值为UTF-8,否则依旧乱码。
pageEncoding="GBK" %> 中的charset的值为UTF-8,否则依旧乱码。
【例如:<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8”/>】
(2)设置<Connector ….>元素的属性useBodyEncodingForURI=“true”,(默认没有设置此属性),意思是URI使用和请求体一样的编码方式,以请求体的为准。
即URI和 <%@ page language="java" contentType="text/html; charset=XXX"
pageEncoding="GBK" %> 中的charset=XXX的编码方式一致。(可以是GBK,也可以是UTF-8)
pageEncoding="GBK" %> 中的charset=XXX的编码方式一致。(可以是GBK,也可以是UTF-8)
【例如:<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"useBodyEncodingForURI=“true”/>】
注意:同时设置这两个属性(URIEncoding="UTF-8” 与 useBodyEncodingForURI=“true”),则URI还是使用和请求体一样的编码方式,useBodyEncodingForURI=“true”有效,URIEncoding="UTF-8”无效。
一步到位
1、通过修改server.xml指定服务器对get和post统一按照utf-8解码,即同时设置(URIEncoding="UTF-8” 与 useBodyEncodingForURI=“true”)
2、要求tomcat管理下的所有web应用都要使用utf-8编码,即所有的jsp、html页面都使用utf-8编码。
比如 JSP页面的头信息是这样的:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"]]>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"]]>
<title>Insert title here</title>
</head>
3、在Servlet的doGet和doPost方法中:
通过 request.setCharacterEncoding("UTF-8"); 这行代码,
告诉服务器,使用“UTF-8”编码字符集,对请求参数进行解码。
这样,应该就不会出现request和response的中文乱码问题了。
2、要求tomcat管理下的所有web应用都要使用utf-8编码,即所有的jsp、html页面都使用utf-8编码。
比如 JSP页面的头信息是这样的:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"]]>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"]]>
<title>Insert title here</title>
</head>
3、在Servlet的doGet和doPost方法中:
通过 request.setCharacterEncoding("UTF-8"); 这行代码,
告诉服务器,使用“UTF-8”编码字符集,对请求参数进行解码。
这样,应该就不会出现request和response的中文乱码问题了。
·办法二:回退重编
根据ISO-8859-1进行回退
1、超链接:根据 <%@ page language="java" contentType="text/html;charset=XXX" pageEncoding="XXX"%> 中的charset的值 进行重编,即可得到正常的参数值。
2、在地址栏直接输入URL:根据UTF-8进行重编。
例如:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
String name = request.getParameter("name”);//得到乱码
name = new String(name.getBytes("iso-8859-1"),"utf-8”);//得到正常的name值
注意:name.getBytes();如果不指定编码,默认按照gb2312进行编码。
name = new String(name.getBytes("iso-8859-1"),"utf-8”);//得到正常的name值
注意:name.getBytes();如果不指定编码,默认按照gb2312进行编码。