zoukankan      html  css  js  c++  java
  • JavaWeb处理GET、POST时的编码乱码问题

    对于GET方法,只要设置了res.setContentType("text/html;charset=UTF-8"), req.getParameter()就不会产生乱码。

    对于POST方法,req.getQueryString()会返回null, req.getParameter()会产生乱码

    需要用new String(req.getParameter("e").getBytes("iso-8859-1"), "utf-8")来得到正确的编码。

    测试代码如下:

    out.println("req.getParameter("e"):"+req.getParameter("e")+"</br>");
    out.println("req.getParameter("e"):"+new String(req.getParameter("e").getBytes("iso-8859-1"), "utf-8")+"</br>");
    out.println("java.net.URLEncoder.encode("叫苦连天二胎", "utf-8"):"+"</br>"+java.net.URLEncoder.encode("叫苦连天二胎", "utf-8")+"</br>");
    byte[] bs = req.getParameter("e").getBytes("iso-8859-1");
    for (byte b: bs) {
       out.print("%"+Integer.toHexString(0x000000ff&b).toUpperCase());
    }
    out.println("</br>");
    

      

    浏览器显示结果:

     根据

    java.net.URLEncoder.encode("叫苦连天二胎", "utf-8")
    

     的输出结果

    %E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E
    

    java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "iso-8859-1")
    

    的输出结果

    叫苦连天二胎
    

    对比可以看到,浏览器发送get、post请求时根据网页设定的编码将字符转化问网页的编码用%分隔,在本例中是UTF-8编码每个字节用一个%分隔。

    例如, 叫苦连天二胎 的编码的 E58FABE88BA6E8BF9EE5A4A9E4BA8CE8838E ,每个字节前面加上一个%就变成了

    %E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E
    

    而tomcat收到GET请求时,直接用req.getParameter("e")时内部会使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "utf-8") 会获得正确的字符 叫苦连天二胎 。

    对于POST请求,直接用req.getParameter("e")会得到乱码 å«è‹¦è¿žå¤©äºŒèƒŽ ,因为tomcat内部会使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "iso-8859-1") 从而得到错误的 å«è‹¦è¿žå¤©äºŒèƒŽ 。此时我也应该使用先使用 java.net.URLEncoder.encode(req.getParameter("e"),"iso-8859-1") 把 å«è‹¦è¿žå¤©äºŒèƒŽ 还原成 %E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E 然后再使用 java.net.URLDecoder.decode("%E5%8F%AB%E8%8B%A6%E8%BF%9E%E5%A4%A9%E4%BA%8C%E8%83%8E", "utf-8") 解码即可得到正确的字符 叫苦连天二胎 ,代码如下:

    java.net.URLDecoder.decode(java.net.URLEncoder.encode(req.getParameter("e"),"iso-8859-1"), "utf-8")

    即可得到正确的结果。 如下图:

     

  • 相关阅读:
    [论文收集]Web service security (尤其是RBAC)相关的论文 [更新中]
    [文章摘录] The Case for Cloud Computing (ITPro, 2009)
    [文章摘录] 网络计算系统的分类研究 (计算机学报, 2008)
    文献综述的写法
    [转]VS2005常用快捷键大全
    什么是存储过程
    使用冒泡法对数组排序
    ASP.NET中使用Global.asax文件
    轻松掌握Ajax.net系列教程
    客户端回调实现gridView无刷新分页
  • 原文地址:https://www.cnblogs.com/xxNote/p/7025992.html
Copyright © 2011-2022 走看看