中文亂碼處理

由於編碼方式的不同,各種編碼處理的語言不通,將導致中文亂碼問題:

一、幾種常見的編碼方式:

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");

發佈了36 篇原創文章 · 獲贊 20 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章