先说一下乱码的原因:
乱码是因为编码和解码的格式不一而引发的问题。
我们来看一下以下步骤:
1.在前端页面传输数据时,会先将数据进行编码再进行传输(浏览器默认的编码格式是UTF-8)
2.数据传输到Servlet时,tomcat会使用其默认编码进行解码。
测试结果Tomcat从8.0开始转化为默认编码为utf-8的格式了,但是8.0以下的tomcat默认的编码还是ISO-8859-1;
3.获得的参数用response封装返回时,要设置相对应的编码格式和解码格式。
所以如果出现问题,那么一定是以上步骤中有编码解码格式不一致的情况。
如何修改tomcat默认编码?
修改tomcat下的conf/server.xml文件,找到Connector标签,添加 URIEncoding="UTF-8"
最终结果为如下代码:
<Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
response如何设置对应的编码和解码格式?
编码
response.setCharacterEncoding("utf-8");
解码
response.setContentType("application/json; charset=utf-8");
POST方式遇到的问题:
使用POST进行获取参数的时候要注意!
必须在doPost方法的一开始就使用:request.setCharacterEncoding("utf-8");
或者在过滤器中一开始就写上request.setCharacterEncoding("utf-8");来保证POST方式后面获取到的parameter正常,
【这里有个问题要记录一下,如果不写这一句直接在doPost中getParameter,就会造成获取的中文参数异常:这句代码约束post中的内容解码格式为utf-8,必须写在doPost或者filter中第一个request.getParameter之前才行,如果没有设置utf-8,在调用第一个getParameter之后request中的所有键值对就都被解析成了ISO-8859-1的编码的字符了,再去设置characterEncoding为utf-8就已经无效了,就只能通过getParameter之后new String(xxx.getBytes("ISO-8859-1"),"utf-8")的方式来还原字符串了】
但是get方式是取决于Tomcat的默认URLencoding的编码。