JavaWeb处理GET、POST时的编码乱码问题

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

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

须要用new String(req.getParameter("e").getBytes("iso-8859-1"), "utf-8")来获得正确的编码。浏览器

测试代码以下:tomcat

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>");

  

浏览器显示结果:post

 根据测试

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

 的输出结果编码

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

spa

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")

的输出结果.net

叫苦连天二胎

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

例如, 叫苦不迭二胎 的编码的 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")

 

便可获得正确的结果。 以下图:

相关文章
相关标签/搜索