您的位置:首页 > 产品设计 > UI/UE

request和response中文乱码

2016-03-16 11:05 387 查看

request和response中文乱码及解决方法

request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码;

response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码;

乱码产生的原因:不管是request乱码还是response乱码,其实都是由于浏览器跟服务器端采用的编码格式不一致造成的。以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器之间的通信实质上是socket流,所以要先将请求参数(字符)转换成字节(编码过程),服务器接收到请求参数后进行解码(字节转字符),然后封装到request对象中。如果客户端的编码与服务器端的解码不统一,就会导致通过request获取到的请求参数的值是乱码。

response乱码

服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。对于response乱码,只需要在服务器端指定一个编码字符集,然后通知浏览器按照这个字符集进行解码就可以了。

1.A设置服务器端的编码

response.setCharacterEncoding("utf-8");
该方法必须在
response.getWriter()
之前进行设置。

B通知浏览器服务器发送的数据格式

response.setContentType("text/html;charset=utf-8");
等价于

response.setHeader("contentType", "text/html; charset=utf-8");


C浏览器使用utf-8进行解码

2.当用到
response.sendRedirect("____?name="+u)
转向时
,u一定要为iso-8859-1编码方式,否则容易出现乱码。将utf-8编码的中文转为iso-8859-1编码:

String u=new String(uu.getBytes("utf-8"),"iso-8859-1");//uu为utf-8编码的中文


中文u的值传入到转向的servlet,iso-8859-1自动转为utf-8编码,若无自动转换,用上述转换代码进行转换。

request乱码

从浏览器发起的访问方式有三种:在地址栏直接输入URL访问、点击页面中的超链接访问、提交表单访问。第一种访问方式浏览器默认将参数按照utf-8进行编码,后面两种访问方式浏览器将参数按照当前页面的显示编码进行编码。所以对于request乱码,只需要在服务器端设置相应的解码格式即可。由于访问方式不同,浏览器对参数的编码格式也不同,为了方便处理,通过超链接和表单的访问也规定必须是utf-8格式,即显示当前页面的编码也要使用utf-8,这样浏览器将统一使用utf-8对参数进行编码。

1.post方式属于表单提交,参数存在于请求体中。

request.setCharacterEncoding("utf-8")


2.get方式属于表单提交,参数存在URL中,服务器按照默认的iso-8859-1进行解码

String u=new String(request.getParameter("").getBytes("iso-8859-1"),"utf-8")


3.超链接访问中有中文参数时,可以修改服务器端对URL参数的默认编码。在tomcat的server.xml中,设置元素的属性URIEncoding=”UTF-8”即可。以上只要涉及URL中有中文都可试着用此方法解决。

利用过滤器解决乱码问题:

在Filter的
init
方法中获取
web.xml
的filter编码设置:

String charEncoding=fConfig.getInitParameter("encoding");


在Filter的
doFilter
方法中设置:

//当前应用的默认编码与请求的编码值不相同,执行
if(!charEncoding.equal(request.getCharacterEncoding())){
request.getCharacterEncoding(charEncoding);
}
response.getCharacterEncoding(charEncoding);


web.xml配置

<filter>


<init-param>


<param-name>encoding</param-name>


<param-value>UTF-8</param-value>


</init-param>


</filter>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: