4.6 请求参数中文问题
HTTP协议规定浏览器想WEB服务器传递参数信息中不能出现特殊字符,而必须将其进行URL编码后再传送。将URL解码得到的字节数组按照某种字符集编码转换为Unicode字符串。同一个字符在不同字符集中对应的数值不同,比如GB2312编码占2个字节,而UTF-8占3个字节,所以在未告知浏览器编码格式的情况下会产生乱码问题。
4.6.1 中文字符URL编码
Java字符串进行URL编码,对它的某种字符集编码书籍进行URL编码,而Java的字符串以Unicode字符集编码存在,所以在Java字符串编码时,必须制定对这个字符串进行URL编码。JDK提供两个方法URLEncoder、URLDecoder来完成对URL的编码和解码。
public static String encode(string,encode) public static String decode(string,encode)
String utf8Url = URLEncoder.encode("中国", "UTF-8"); String gb2312Url = URLEncoder.encode("中国", "GB2312"); System.out.println("UTF-8 Code:" + utf8Url); System.out.println("GB2312 Code:" + gb2312Url); System.out.println("UTF-8 DeCode:" + URLDecoder.decode(gb2312Url, "GB2312")); System.out.println("ISO8859-1 DeCode:" + URLDecoder.decode(gb2312Url, "ISO8859-1"));
输出结果为:
UTF-8 Code:%E4%B8%AD%E5%9B%BD
GB2312 Code:%D6%D0%B9%FA
UTF-8 DeCode:中国
ISO8859-1 DeCode:???¨2
4.6.2 浏览器URL编码
1、 可以使用JSP的meta对JSP页面进行编码约束。
<meta http-equiv="Content-Type" content="text/html;charset=GB2312">
2、 可以使用getCharacterEncoding/setCharacterEncoding方法
可以使用ServletRequest对象的getCharacterEncoding/setCharacterEncoding方法可以设置实体内容的编码集。
4.6.3 getParameter()中文问题
1、 对于HTTP请求中那个的URL地址后面的参数,getParameter()方法进行URL解码的字符集子在Servlet中没有规定,有Servlet引擎厂商自行决定。Tomcat中使用ISO-8859-1编码。
2、 对于POST方式下的application/x-www-form-urlencoded编码格式的实体内容,可以使用ServletRequest的getCharacterEncoding()方法返回的字符集编码对其进行URL解码。ServletRequest定义的setCharacterEncoding()方法设置请求消息中的实体内容的字符集编码名称。request.setCharacterEncoding("GB2312");
4.6.4 Dispatcher中文问题
String china = "中国"; RequestDispatcher rd = request.getRequestDispatcher("/servlet/ChineseParamServlet?param=" + URLEncoder.encode(china, "GB2312")); rd.forward(request, response); response.setContentType("text/html;charset=GB2312"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("GB2312"); String value = request.getParameter("param"); out.println("param =" + value + "<br>");
注:当使用URL后面添加参数的形式进行传参时可以考虑使用URLEncoder.encode()方法进行编码的转换。