利用Tomcat8作为服务器,采用servlet接收前端请求后进行处理的过程中,前台请求中有中文时,中文信息变成了乱码。
经过调试和查阅,发现Tomcat在处理get请求和post请求是有区别的。参照网上的各种说法,进行一下实验:
jsp页面与后台采用的都是utf-8编码,所以只对utf-8的编码方式进行比较,对比的代码如下:
String name=request.getParameter("username");
String param=new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");
System.out.println(name+" "+param);
测试:
1.chrome浏览器 post请求 请求编码未设置
前端jsp页面设定为utf-8编码,结果name为乱码 param可以正确解析。网上查到post请求tomcat的默认的编码方式是iso-8859-1所以会出现如上结果
2.ie浏览器 post请求 请求编码未设置
结果与前完全相同name为乱码 param可以正确解析
3.chrome浏览器 get请求 请求编码未设置
结果是name可以正确解析,param为乱码 可见上来的请求时utf-8的,和前端页面一致
4.ie浏览器 get请求 请求编码未设置
结果和之前相同,name可以正确解析,param为乱码
之后又尝试了前端采取gbk方式编码的测试。现在直接说结果吧
结论
对于Tomcat服务器post请求是按照iso-8859-1进行编码的,get请求则是按照前端页面的编码方式编码的
那么,我们在实际使用中,保证前后端编码格式一致是很有必要的,可以避免很多麻烦,要么都用gbk,要么都用utf-8
如果一致了,那么get请求就可以直接进行解析,但是post请求还得进行处理。如果采用了如下代码
request.setCharacterEncoding("UTF-8");
那么post请求之后就可以直接获取参数,或者可以直接用
String param=new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");
这篇文章只是简单的进行了一下实验和分析,肯定还有不足和遗漏的地方,希望大家多多指教
ps 再补充一点,在实验过程中,springmvc中返回为了方便用了@ResponseBody注解,返回中文时也出现了乱码,发现springmvc默认采用的iso-8859-1,所以返回字符串可以用
return new String("你好".getBytes(), "ISO-8859-1");