由于编码方式的不同,各种编码处理的语言不通,将导致中文乱码问题:
一、几种常见的编码方式:
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");