由于编码方式的不同,各种编码处理的语言不通,将导致中文乱码问题:
一、几种常见的编码方式:
1、ISO-8859-1:属于单字节编码,最多表示的字符范围是0-255,应用于英文系列。
2、GB2312/GBK:属于汉字的国标码,专门表示汉字,是双字节编码,还兼容ISO-8859-1编码,其中GBK同时表示繁体字和简体字,而GB2312只能表示简体字。
3、Unicode:属于同一编码,可以表示所有语言的字符,但它是定长双字节编码,故不兼容ISO-8859-1编码。
4、UTF-8:Unicode编码不兼容ISO-8859-1,而且占用空间更多,不便于传输和存储,UTF-8兼容ISO-8859-1而且表示所有语言字符。
二、产生乱码的几种原因:
1、在JSP编译成class文件时,如果没有指定编码格式,系统默认的编码格式为ISO-8859-1。
2、表单通过POST方法提交,未指定提交编码格式,则会默认ISO-8859-1编码提交。
3、表单通过GET方法提交,Tomcat会以默认的(ISO-8859-1)编码格式,追加到URL上,将导致乱码。
三、解决方法:
1、连接数据库时,指定编码格式:jdbc:mysql://localhost:3306/test&useUnicode=true&characterEncoding=UTF-8;
2、通过设置接收和响应的编码格式:request.setCharacterEncoding("GBK");response.setContentType("text/html;charset=GBK");
3、通过过滤器设置,其实这个和第二种是同样的道理的:
package com.song.EncodingFilter;
import java.io.*;
import javax.servlet.*;
public class EncodingFilter implements Filter{
private String encoding = null;
private FilterConfig config = null;
public void destroy(){
this.encoding = null;
this.config = null;
}
public void doFilter(ServletRequest req,
ServletResponse res,
FilterChain chain)
throws ServletException, IOException{
String type = getEncoding(req);
if(type != null){
req.setCharacterEncoding(type);
}
chain.doFilter(req,res);
}
public void init(FilterConfig config)throws ServletException{
this.config = config;
this.encoding = config.getInitParameter("encoding");
}
public String getEncoding(ServletRequest req){
return this.encoding;
}
}
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.song.EncodingFilter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、因GET方式是吧参数添加到URL上,这些方法对于GET方法提交的话将不会起到作用,对于GET提交,我们可以在Tomcat的server.xml中设置编码格式:如下:
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding=“GBK”/>
还有一种就比较麻烦点了,不过使用的也挺多的:String name = new String(username.getBytes("ISO-8859-1"),"GBK");