问题:
E浏览器下url带中文请求参数,服务器端使用new String(param.getBytes(“iso-8859-1”), “utf-8”)后仍然会乱码。
但使用chrome浏览器则正常。
代码如下:
解决:
使用URLEncoder和URLDecoder对url参数进行编解码。即,在jsp中对“小红”进行URLEncode编码后再传参即可解决。
==================================================================================================================
但会导致另一个很奇怪的问题,想不明白。解决代码如下:
XMLHttpRequestTest.jspfunction getAjax() {var xmlrequest = getXMLHttp();xmlrequest.onreadystatechange = function() {//xmlrequest状态变化,触发函数if(xmlrequest.readyState == 4) {// 4 数据接收完毕if (xmlrequest.status == 200) {alert(xmlrequest.responseText);}}}var username = encodeURI("小红"); //使用urlencoder进行中文的十六进制转码。此时username值为"%E5%B0%8F%E7%BA%A2"xmlrequest.open("GET","${pageContext.request.contextPath}/xmlRequest?username="+username+"&password=123");//xmlrequest.open("GET", "${pageContext.request.contextPath}/xmlRequest?username=小红&password=123");xmlrequest.send(null);}
疑问如下:
XMLHttpRequestTestServlet.javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//问题一:jsp中使用了var username = encodeURI("小红");//在jsp页面中打断点查看发现username确实被转码成了"%E5%B0%8F%E7%BA%A2"//但是在此处打断点查看username却不是"%E5%B0%8F%E7%BA%A2",而是"å°çº¢",为什么?String username = request.getParameter("username");String password = request.getParameter("password");//解决get方式请求参数乱码username = new String(username.getBytes("iso-8859-1"), "utf-8");password = new String(password.getBytes("iso-8859-1"), "utf-8");//问题二:如果URLEncoder是进行十六进制的转码,//那么jsp页面中使用了encodeURI(),服务器端为什么不需要使用URLDecoder也能输出编码前的中文?//username = URLDecoder.decode(username, "utf-8");//解决响应乱码response.setContentType("text/html;charset=UTF-8");System.out.println(username+" : "+password);response.getWriter().print("get 成功");}
参考/jinks/p/3533640.html后解决上述疑惑。
上述问题原因:url是不支持非ASCII字符的,当地址栏url路径带中文参数时,就会产生乱码。
一般浏览器会自动帮我们进行urlencode的十六进制编码,并且urldecode的解码也会由tomcat帮我们自动完成。
但IE浏览器不会帮我们自动进行urlencode编码。
并且由于tomcat是外国人写的,所以parameter的值是被iso-8859-1编码,需要我们再进行一次utf-8的解码。
即new String(param.getBytes(“iso-8859-1”), “utf-8”);