初学 web 项目开发时,很多人都会遇到中文显示乱码问题,百度一下解决方案看的眼花缭乱,再怎么修改问题依然得不到解决。乱码是如何产生的?当你知道为什么会乱码,理解底层原理之后,你会发现眼前一亮,话不多说,看下图:
通过上图可知
- 编码1 和 解码1 使用的编码格式必须相同
- 编码2 和 解码2 使用的编码格式必须相同
注意:满足上述两条肯定时不会出现乱码的,一般在这四个地方都使用 UTF-8(万国码)
编码设置:(根据上图序号)
-
form表单:
<form id="xx" action="xx" method="xx" accept-charset = "UTF-8">
-
服务器的编码格式(request):
GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认编码。而GET请求则不同,Tomcat对GET请求统一使用Tomcat默认的编码。
Tomcat 7 及以前的版本 默认编码方式为 IOS-8859-1, 从Tomcat 8开始默认使用 UTF-81.接收get方式
方式一:(知道使用什么字符集编码)先解码,再编码
String str = new String(getParameter("message").getBytes("ISO-8859-1"),"UTF-8");
方式二:修改tomcat配置文件 (不建议)
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
2.接收post方式
方式一:request.setCharacterEncoding("UTF-8") ;
(放在获取参数前才有效)方式二:需要在web.xml中配置过滤器
<!-- post乱码过虑器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-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>
-
response :
方式一:response.setCharacterEncoding("UTF-8");
(只能用来设置out输出流中所采用的编码)方式二:
response.setContentType("text/html;charset=UTF-8");
(设置out输出流中字符的编码方式,同时也设置浏览器接收到这些字符后以什么编码方式来解码) -
浏览器显示:
jsp 或者 html 页面头部添加<meta content="text/html; charset=utf-8" />"
在浏览器中打开开发模式,在控制台中 使用 document.charset 可查看当前页面的编码格式
总结: 在上述四个地方的编码方式相同,乱码就不会发生了。