一,乱码原因
原因:前端(服务端)编码和后端解码格式不匹配。(服务端默认编码格式是iso8859-1)
将页面的编码格式申明为UTF-8
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
在jsp页面还要使用
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="Utf-8"%>
pageEncodeing:指的是jsp的内容编码(使用UTF-8)
contentType : 服务端到后端的编码格式需要与后端解码格式相同
二、解决乱码
解决:将前端编码格式与后端转码格式设置为一样
1.response乱码
字符流编码设置
response.setCharacterEncoding("UTF-8");
response.setHeader("content-type", "text/html; charset=utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
字节流编码设置
response.getOutputStream().write("字符".getBytes("UTF-8"));
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");
2.request编码
1.get请求
1.使用new String("字符".getbytes("ISO8859-1"),"UTF-8")来进行手动转码
2.设置tomcat的server.xml的配置文件
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
2.post请求
request.setCharacterEncoding(“UTF-8”);(意思是将请求的数据进行utf-8转码)
3.编码过滤
1.在web.xml下面设置spring的编码过滤能解决大部分编码问题
<!-- 中文编码过滤 开始-->
<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>
<!-- 中文编码过滤 结束-->
2.但是有时使用post提交时(request流接收时任然不能正确转码)所以在读取流时可以下边进行转码
/**
* 将一个输入流转化为字符串(转化编码格式)
*/
public static String getStreamString(InputStream tInputStream) {
if (tInputStream != null) {
BufferedReader tBufferedReader = null;
try {
tBufferedReader = new BufferedReader(new InputStreamReader(tInputStream,"UTF-8"));
StringBuffer tStringBuffer = new StringBuffer();
String sTempOneLine = new String("");
while ((sTempOneLine = tBufferedReader.readLine()) != null) {
tStringBuffer.append(sTempOneLine);
}
return tStringBuffer.toString();
} catch (Exception ex) {
ex.printStackTrace();
}finally{
try {
if(null != tBufferedReader){
tBufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}