由於編碼方式的不同,各種編碼處理的語言不通,將導致中文亂碼問題:
一、幾種常見的編碼方式:
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");