1、UTF-8国际编码,GBK中文编码。GBK包含GB2312,即如果通过GB2312编码后可通过GBK解码,反之可能不成立。
2、web tomcat:默认是ISO8859-1,不支持中文的。
3、中文乱码问题:其实是因为编码和解码的不一致造成的。首先确保html或jsp页面的编码格式是某个编码,比如utf-8,因为客户端对正文内容的编码是根据页面的编码来设定的,所以你只需要在服务器读出参数之前设置解码的字符集,响应回去之前设置编码的字符集,这样就可以搞定了。
SpringMVC的中文乱码问题主要有以下几种情形:
1. 页面传值到后台乱码:
工程编码(最好一开始建立工程就设置整个工程的编码)
页面的几种编码属性的设置
get提交方式乱码的处理
post提交方式乱码的处理
2. 后台到数据库乱码:
数据库连接字符串指定编码格式
数据库编码属性(也是一开始设置数据库的时候就要设置好,不然要重新建数据库)
一. 页面传值到后台乱码
1) JSP 文件编码 :
2) html 文件编码 :
3)get提交方式乱码的处理(一般由于tomcat引起的,所以需要设置tomcat的编码):
原因:请求参数带在url地址上、url地址什么时候解析? tomcat收到请求对url进行编解码(ISO8859-1)
解决方案:在tomcat的server.xml配置文件中改Connector标签,加上一个 URIEncoding=”utf-8”
4)post提交方式乱码的处理(在web.xml中设置编码过滤器):
原因:post请求参数是在请求体中, 请求体的解码是在第一次获取参数的时候。
解决方案:filter可以用来解决乱码,一定要放到前面
请求编码 request.setCharacterEncoding("utf-8"), 响应编码 response.setContentType("text/html;charset=utf-8")
SpringMVC自带的一个解决中文乱码的 CharacterEncodingFilter 过滤器,项目的web.xml中配置:
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceRequestEncoding
false
forceResponseEncoding
false
CharacterEncodingFilter
/*
来看看CharacterEncodingFilter的源码 :
public class CharacterEncodingFilter extends OncePerRequestFilter {
@Nullable
private String encoding;
private boolean forceRequestEncoding = false;
private boolean forceResponseEncoding = false;
//构造器
public CharacterEncodingFilter() {
}
public CharacterEncodingFilter(String encoding) {
this(encoding, false);
}
public CharacterEncodingFilter(String encoding, boolean forceEncoding) {
this(encoding, forceEncoding, forceEncoding);
}
public CharacterEncodingFilter(String encoding, boolean forceRequestEncoding, boolean forceResponseEncoding) {
Assert.hasLength(encoding, "Encoding must not be empty");
this.encoding = encoding;
this.forceRequestEncoding = forceRequestEncoding;
this.forceResponseEncoding = forceResponseEncoding;
}
//get,set方法
public void setEncoding(@Nullable String encoding) {
this.encoding = encoding;
}
@Nullable
public String getEncoding() {
return this.encoding;
}
public void setForceEncoding(boolean forceEncoding) {
this.forceRequestEncoding = forceEncoding;
this.forceResponseEncoding = forceEncoding;
}
public void setForceRequestEncoding(boolean forceRequestEncoding) {
this.forceRequestEncoding = forceRequestEncoding;
}
public boolean isForceRequestEncoding() {
return this.forceRequestEncoding;
}
public void setForceResponseEncoding(boolean forceResponseEncoding) {
this.forceResponseEncoding = forceResponseEncoding;
}
public boolean isForceResponseEncoding() {
return this.forceResponseEncoding;
}
//doFilterInternal方法
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String encoding = getEncoding();
if (encoding != null) {
if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}
if (isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}
}
filterChain.doFilter(request, response);
}
}
二、 后台到数据库乱码
1)数据库连接 字符串指定编码:
jdbc.url=jdbc:mysql://localhost:3306/sshweb?useUnicode=true&characterEncoding=utf8&useSSL=true
2)数据库新建时的编码属性:
ends~