基于Servlet的GET和POST请求,通过getParameter()方法获取到前端网页提交的数据会出现中文乱码情况。
GTE与POST情况不同,分开讨论。
一、POST请求
原因:
POST请求时,该方法获取参数值时是通过输入流获取,tomcat默认该流的编码为“ISO-8859-1”(页面中的文字信息是用“UTF-8”编码的),因此就出现了中文乱码。
解决:
我们只要手动设置该流的编码为“UTF-8”即可(在读取数据前)。
// POST请求解决乱码:设置字符输入流的编码
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
System.out.println(name);
resp.setHeader("Content-Type", "text/html;charset=UTF-8");
resp.getWriter().write("<h1>"+name+",欢迎您!</h1>");
效果:
二、GET请求
相比于POST,GET请求的原因较为复杂。
POST获取参数使用流,但GET不是,而是通过getQueryString获取。
剖析:
我们在前端页面输入“暴龙战士”后,浏览器会将这四个字传给Tomcat服务器,但浏览器不支持中文,因此浏览器会先将中文编码(采用url编码,形式为“%”+两个十六进制数),然后将该url编码传送给Tomcat,Tomcat再对该url编码进行解码,倘若Tomcat也采用url对该编码进行解码,亦可还原信息,但是Tomcat默认采用“ISO-8859-1”,这样就造成了信息不对等。那既然这样,只要我们更改Tomcat的解码方式,不就行了吗?不行哈,该方法的底层解码方式是写死的,我们不能改。
那为什么当我们采用GET请求方式发送请求时可以在url路径中看到中文呢?如下:
因为当前市场上的主流浏览器都对url编码进行了解码,可以方便我们阅读,(有些浏览器就不会,譬如IE)但当它发送时,发送的还是乱码:
这一块内容都是浏览器为我们做的,即url编码
// URL编码
String encode = URLEncoder.encode(name, "UTF-8");
System.out.println(encode);
// URL解码
String decode = URLDecoder.decode(encode, "UTF-8"); // Tomcat在这一环节未使用“UTF-8”而使用"ISO-8859-1"导致出现了差错
System.out.println(decode);
解决:
由于编码、解码的方式不一样导致了出错,我们只需要拿到数据,将其转换成二进制数,再将其编码成字符串,就可以啦。
String name = req.getParameter("name");
System.out.println(name);
// 转换字节数据
byte[] bytes = name.getBytes("ISO-8859-1"); // 我们拿到的数据用的"ISO-8859-1"
// 字节数组转换成字符串
String s = new String(bytes, "UTF-8"); // 将该字节组以"UTF-8"形式转换成字符串
System.out.println(s);
效果: