码迷,mamicode.com
首页 > 编程语言 > 详细

java Web 中文乱码

时间:2017-11-02 14:29:21      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:问题本质   修改   iso   sdn   解析   bytes   过程   style   byte   

参考:http://www.cnblogs.com/haimishasha/p/6117968.html  (关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换 - 海米傻傻 - 博客园)

参考:http://www.cnblogs.com/haitao-fan/p/3399018.html(浏览器URL编码 - 尼玛范爷 - 博客园)

参考:http://blog.csdn.net/dbb_zifeng/article/details/53304266(中文乱码之填坑Java web - CSDN博客)

今天下载一个中文文件结果是404,文件在路径下存在,将文件名改成英文就可以下载了,所以应该是中文编码的问题。

环境:apache-tomcat-7.0.72 

在网上找了一下方法,这些方法是对应服务器端乱码的情况

方法1

<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>

方法2

String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");

方法3

request.setCharacterEncoding("gbk");

一次Http请求

浏览器【get/post】------------>解析URL-------------->获取参数----------返回页面-------------------->浏览器显示

解码过程

浏览器编码------------->服务器解码--------------------->浏览器解码

情况一:中文URL

URL:http://localhost:9080/DataDiscoveryWeb/resources/doc/新建文本文档.txt (这是一个直接访问文件的URL)

问题:访问不到

问题原因:浏览器对中文URL进行编码---------------------->服务器使用了不同于浏览器的编码方式解码

1.浏览器对URL编码

各个浏览器对URL的编码不同

解决方法:手动将此中文进行编码:encodeURI(url),encodeURI编码默认使用的是utf-8编码方式

http://localhost:9080/DataDiscoveryWeb/resources/doc/新建文本文档.txt  ---------> http%3A%2F%2Flocalhost%3A9080%2FDataDiscoveryWeb%2Fresources%2Fdoc%2F%E6%96%B0%E5%BB%BA%E6%96%87%E6%9C%AC%E6%96%87%E6%A1%A3.txt

2.Tomcat服务器对URL解码 

  当tomcat接收到该链接时,将会进行URL解码,即去掉"%",同时按照ISO8859-1编码识别。

  Tomcat 默认的解码为ISO-8859-1,所以解析成  http://localhost:9080/DataDiscoveryWeb/resources/doc/??°??o???????????£.txt

解决方法:

  设置Tomcat的Server.xml文件<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>

  设置URIEncoding="UTF-8"后,使用UTF解码,结果是 http://localhost:9080/DataDiscoveryWeb/resources/doc/新建文本文档.txt

情况二:Get请求参数中有中文

URL:http://localhost:8080/myServlet?name=力量

问题:接受参数乱码

问题原因:问题原因与情况一是一样的,      浏览器对中文URL进行编码---------------------->服务器使用了不同于浏览器的编码方式解码(浏览器对请求参数的编码和URL直接写中文编码可能不同)

浏览器编码: 1.直接地址栏上写http://localhost:8080/myServlet?name=力量        使用的是浏览器默认的编码

       2.在页面上写http://localhost:8080/myServlet?name=力量,使用页面的ContentType定义的Charset,(jsp页面上的contentType="text/html;charset=gb2312")

我的JSP页面代码

<%@ page contentType="text/html;charset=gb2312" language="java" %>
<html>
<body>
<h2>力量</h2>
<a href="/myServlet?name=力量">跳转</a>
<a href="/resources/doc/新建文本文档.txt">下载文件</a>
</body>
</html>

点击跳转,地址栏上变成  http://localhost:8080/myServlet?name=%C1%A6%C1%BF(使用的是contentType中的charset的编码方式)  

点击下载文件,地址栏变成      http://localhost:8080/resources/doc/新建文本文档.txt(最终使用浏览器的编码方式   http://localhost:8080/resources/doc/%E6%96%B0%E5%BB%BA%E6%96%87%E6%9C%AC%E6%96%87%E6%A1%A3.txt)

解决方法:

方法1:与情况一的解决方法一样,修改tomcat Server.xml ,<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>,不过此时页面的contentType中的charset也一定要设置为utf-8

方法2:在获取参数的时候修改

String name = req.getParameter("name");
System.out.println(name);
String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");//此处与页面的contentType中的charset一致
System.out.println(usernameString);

情况三:Post请求中参数带中文

URL:http://localhost:8080/myServlet     请求参数 name:力量

问题: 服务器中获取参数String name = req.getParameter("name")  乱码

原因:问题原因与情况一是一样的,      浏览器对中文URL进行编码---------------------->服务器使用了不同于浏览器的编码方式解码

浏览器编码的方式也是根据 contentType中的charse

解决方法:

方法1:与情况一的解决方法一样,修改tomcat Server.xml ,<Connector executor="tomcatThreadPool"  port="8080" protocol="HTTP/1.1"   connectionTimeout="20000"   redirectPort="8443" URIEncoding="UTF-8"/>,不过此时页面的contentType中的charset也一定要设置为utf-8

方法2:与情况二中的解决方法2样,接收参数是转码  String usernameString = new String(name.getBytes("ISO-8859-1"),"gb2312");

方法3:request.setCharacterEncoding("gbk");   一定要在request.getParameter("name")获取参数之前设置编码。

 

注意:HttpServletRequest.setCharacterEncoding()方法 仅仅只适用于设置post提交的request body的编码而不是设置get方法提交的queryString的编码。问题本质是get方式传递的参数内容默认编码方式问ISO8859-1,而且使用request.setCharacterEncoding("utf-8")也无法解决问题。

java Web 中文乱码

标签:问题本质   修改   iso   sdn   解析   bytes   过程   style   byte   

原文地址:http://www.cnblogs.com/alway-july/p/7768059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!