中文乱码处理

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()方法进行编码的转换。

你可能感兴趣的:(jdk,tomcat,jsp,servlet,浏览器)