导语:乱码问题产生的原因主要是字符编码的问题;
发送方要发送一串字符,首先必须用字符集给它编码变成0和1即二进制进行传输,接收方需要用同一个字符集进行解码(decode)方才能知道发送方发送的内容。如果双方所用的字符集不一致就会产生乱码。
控制台乱码
设置Tomcat中 conf下logging.properties中所有的UTF-8编码为GBK即可
原理----> 原因是windows中默认中文字符集为GBK,但是tomcat中日志输出为UTF-8,GBK对UTF-8显然是字符集不匹配;
post请求乱码
产生原因----->>>图解
解决方式—>
通过HttpServletRequest设置请求编码
/处理post请求乱码/
req.setCharacterEncoding(“UTF-8”);
那我可不可以指定字符编码为GBK呢?
原因在与这是项目本身运行环境字符集编码为UTF-8,
所以也会产生乱码(但至少不是?之类的符号了)
get请求乱码
在之前版本的tomcat中get方式提交的数据可能会遇到修改server.xml中uri编码格式的情况,但是这在tomcat9已经解决了该问题
<Connector port=“8080” protocol=“HTTP/1.1”
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" />
另一种是需要手动进行编码解码,注意:
req.setCharacterEncoding(“UTF-8”); 这种方式只对post提交方式有效;
这一点在tomcat9之前的版本可以体现,因为版本较旧,就不在演示了
响应乱码
浏览器将数据发送给tomcat服务器,服务器解析,当解码的字符集匹配但是发送的时候指定的编码集与数据类型不一致也会产生乱码问题,比如发送图片(ASCII),响应时指定字符集为文本(GBK),
通过HttpServletResponse设置响应编码
手动编码解码-----
//以UTF-8编码处理数据
resp.setCharacterEncoding(“UTF-8”);
解析为文本,是html文件
resp.setContentType(“text/html”);或者设置tomat连接器的编码格式—
//设置响应头,以便浏览器知道以何种编码解析数据
resp.setContentType(“text/html;charset=UTF-8”);
总结------->>>>
当没有指定解码方式和响应的数据类型(包括响应的数据编码格式)—>>
指定解码方式和响应的数据类型(包括响应的数据编码格式)----->>>
手动编码解码
设定URL的编码格式
这里补充一点-------
还有一种比较费劲的方式-----
这种方式也会得到正常解析,那要浏览器干嘛?如果发送的是图片或者其他的内容岂不很麻烦?
小结:—>>
如何解决POST请求中文乱码问题,GET的又如何处理呢?
(1) 解决post请求乱码问题:
在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
<filter>
<filter‐name>CharacterEncodingFilter</filter‐name>
<!--自带一个过滤器-->
<filter‐class>org.springframework.web.filter.CharacterEncodingFilter</fi
lter‐class>
<init‐param>
<param‐name>encoding</param‐name>
<param‐value>utf‐8</param‐value>
</init‐param>
</filter>
<filter‐mapping>
<filter‐name>CharacterEncodingFilter</filter‐name>
<url‐pattern>/*</url‐pattern>
</filter‐mapping>
(2)get请求中文参数出现乱码解决方法有两个:
①修改tomcat配置文件添加编码与工程编码一致,如下:
1 <ConnectorURIEncoding=“utf‐8” connectionTimeout=“20000” port=“8080” proto
col=“HTTP/1.1” redirectPort=“8443”/>
②另外一种方法对参数进行重新编码:
String userName = new
String(request.getParamter(“userName”).getBytes(“ISO8859-
1”),“utf-8”)
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。