由于平时开发过程当中总遇到乱码的问题,很烦恼,所以总结了一下,加深了本身的印象,有些粗糙,有不正确的地方欢迎指正。最有效的是本身撸码模拟一下全部可能出现乱码的状况。html
一句话就能说明问题: 字符在保存时的编码格式若是和要显示(解码)时的编码格式不同的话,就会出现乱码问题。所以咱们的先后端编码通常都一导致用UTF-8.git
一个http请求通过的环节:github
浏览器--->服务器---->浏览器web
在这个环节中每一步都会有影响编码的因素:ajax
HTML meta data 中的 charsetspring
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello</title>
</head>复制代码
浏览器编码的设置和页面编码不一致会致使页面文字显示乱码
后端
ajaxGet
AjaxGet中的查询参数会受浏览器编码影响,因此最好使用 encodeURI 或 encodeURIComponent 手动显式地将整个 URL 或者查询字符串按 UTF-8 编码。
ajaxPost
ajaxPost 请求时对于 URI 和请求体都是默认按 utf-8 编码,而不受 content type 影响。 因此 ajaxPost 不乱码的必要条件是将服务端 request 中的 characterEncoding 设为"utf-8"。浏览器
经过类org.springframework.web.filter.CharacterEncodingFilter,定义request和response的编码。这是由于在spring源码里默认用的是ISO-8859-1,对中文支持很差,所以这里配置成UTF-8.
在web.xml里配置tomcat
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>复制代码
CharacterEncodingFilter类具备encoding和forceEncoding两个属性,其中encoding是表示设置request的编码,forceEncoding表示是否同时设置response的编码。bash
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />复制代码
Tomcat的conf里的server.xml里的配置,通常配置成UTF-8,也有配置成ISO-8859-1,这里的配置在发起get请求时会对uri进行编码,所以须要进行处理,否则会出现乱码。可是对post请求的body不会产生影响。
解决方法:
$.ajax({
url:"/hello?param=" + encodeURI(encodeURI($("#before").html())),
type:"GET",
contentType:"application/x-www-form-urlencoded; charset=utf-8",
success:function(result){
$("#after").val(result);
}
});复制代码
对get请求的url里的参数进行两次encodeURI;
@RequestMapping(value = "/hello",method = RequestMethod.GET,produces = "text/plain;charset=UTF-8")
@ResponseBody
public String index(@RequestParam("param") String param) throws UnsupportedEncodingException {
String newParam = URLDecoder.decode(param,"utf-8");
String handleMsg = "后台处理后数据:";
String result = handleMsg + newParam;
return result;
}复制代码
后台获取参数时进行一次解码,这样获取到的参数就不会出现乱码。