zoukankan      html  css  js  c++  java
  • java Web 中文乱码

    参考: 关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    参考:浏览器URL编码 - 尼玛范爷 - 博客园

    参考:中文乱码之填坑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】-->浏览器编码-->tomcat解析UR-->获取参数-->返回页面-->浏览器显示

    对于的编解码过程

    浏览器编码-->tomcat解码-->生成结果-->tomcat编码---->浏览器解码

    情况一:中文URL

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

    问题:访问不到

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

    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/新建文本文档.txt

    解决方法:

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

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

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

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

    问题:接受参数乱码

    问题原因:问题原因与情况一是一样的,浏览器对中文URL进行编码-------->tomcat使用了不同于浏览器的编码方式解码(浏览器对请求参数的编码和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进行编码---->tomcat使用了不同于浏览器的编码方式解码,浏览器编码的方式是根据 contentType中的charset。

    解决方法:

    方法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")也无法解决问题。

  • 相关阅读:
    Flutter
    Flutter
    Flutter
    使用Sublime Text 3作为React Native的开发IDE
    新建React Native项目步骤
    【一些容易忘记的node的npm命令】【收集】
    前端异步的一种方法库:axios
    【react】兄弟组件的通信方式,传统非redux
    【js】关于闭包和匿名函数
    【js】手机浏览器端唤起app,没有app就去下载app 的方法
  • 原文地址:https://www.cnblogs.com/alway-july/p/7768059.html
Copyright © 2011-2022 走看看