当页面通过两种方式请求 Servlet 的时候,参数的编码原本为 GBK,在通过 HTTP 服务将请
求发送出去的时候,会将参数重新按照 ISO-8859-1 编码后发送。因此,不管 GET 或 POST
方式,Servlet 接收到的参数数据的编码均为 ISO-8859-1,必须重新转码为 GBK,才能正确
显示中文参数。
1、GET 方式的请求与接收过程
页面中参数“param=中文”的编码原本为 GBK,当用 GET 方式发送参数的时候,参数值会被
Web 服务器从 GBK 转码为 ISO-8859-1。
Servlet 接收到的 GET 请求参数的编码当然为 ISO-8859-1 了,对于中文肯定显示不了,因
此要将 ISO-8859-1 转换为 GBK 就可以正常显示中文了。
String param = request.getParameter("param");
String x = new String(param.getBytes("ISO-8859-1"), "GBK");
System.out.println("GET 方式获取的中文参数值:" + x);
2、POST 方式请求与接收过程
页面中参数“param=中文”的编码原本为 GBK,当点击页面中提交按钮后,参数会以 GBK 编
码格式发送给 Servlet,因此 Servlet 接收参数的时候必须将请求的编码明确设定为 GBK,
这样才能正确接收中文。
request.setCharacterEncoding("GBK");
String param = request.getParameter("param");
System.out.println("POST 方式获取的中文参数值:" + param);
或者,可以按照 get 方式来接收 post 的参数:
String param = request.getParameter("param");
String x = new String(param.getBytes("ISO-8859-1"), "GBK");
System.out.println("GET 方式获取的中文参数值:" + x);
疑问:为什么在 GET 方式下不设定请求的编码格式呢?原因是 GET 方式使用的编码为
ISO-8859-1,用 GBK、UTF-8 等接收效果都是一样的(都是一堆字母和符号),编不编都一
个样,如果指定 ISO-8859-1 编码是多一翻手续,如果指定了非 ISO-8859-1 编码,是脑子还
不清醒,没搞明白这个原理,因此,GET 方式就不要指定请求的编码了。