相信web站點亂碼問題都曾使我們困惑加郁悶不少,在此我積累了幾點解決方案,用於解決不同情況下的亂碼問題,希望能對各位有些許提示作用。
首先應確定不是因為瀏覽器的原因導致中文亂碼。
本人在剛用firefox時就遇到了url中文亂碼的問題,找自己程序及配置找了老久也沒解決問題,后來才發現原來是瀏覽器的配置問題。
問題:編碼為utf-8,url 出現亂碼。form表單get、post方式都無亂碼,頁面鏈接地址也無中文亂碼,刷新頁面無亂碼,但是選中地址欄中的url 敲回車,亂碼出現了!
原因:瀏覽器配置問題。
解決方案:ie:“internet選項/高級”中“總以utf-8發送網址”的選項的配置;
firefox:地址欄中輸入about:config,修改network.standard-url.escape-utf8 為False (缺省為True);
如果你想讓瀏覽器直接url-encode成utf-8,修改network.standard-url.encode-utf8為true(缺省為false)。
解釋:根據Web規范,URL必須以UTF-8字符集進行編碼。 而Firefox默認gbk encode,ie默認utf8 encode;另外Firefox對地址中的中文采取了不同於IE的編碼方式,也就是說:當url參數值含有中文時firefox默認使用escape進行編碼,當參數值沒有用escape進行編碼時,使用進行解碼IE下不會亂碼,但Firefox下會亂碼。
附:prefs.converted-to-utf8 * 首選項轉換成UTF-8編碼格式
network.standard-url * Standard URL settings
ok!確認瀏覽器配置正確后,仍有中文亂碼出現,八成兒就是兄弟你代碼的問題了,解決方案大概有以下幾種。
1、tomcat服務器配置server.xml文件
主要用戶處理與頁面交互時產生的亂碼問題,例如提交表單等。
<!-- Define a non-SSL HTTP/1.1 Connector on port 80-->
<Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="80" redirectPort="8443" URIEncoding="GBK"useBodyEncodingForURI="true" />
URIEncoding:用來設定通過 URI 傳遞的內容使用的編碼,tomcat 將使用這里指定的編碼對客戶端傳送的內容進行編碼。我們通過 get 方法提交的參數實際上都是通過 uri 提交的,由這個參數管理,如果沒有設定這個參數,則 tomcat 將使用默認的 iso8859-1 對客戶端的內容進行編碼。
useBodyEncodingForURI:使用與 Body 一樣的編碼來處理 URI, 這個設定是為了與 tomcat4保持兼容,原來在 tomcat4 和 tomcat5 中隊參數的處理是不一樣的,在 tomcat4 中 get 與 post 的編碼是一樣的,所以只要在過濾器中通過 request.setCharacterEncoding 設定一次就可以解決 get 與 post 的問題。然而,在 tomcat5 中,get 與 post 的處理是分開進行的,對 get 的處理通過前面的 URIEncoding 進行處理,對 post 的內容依然通過 request.setCharacterEncoding 處理,為了保持兼容,就有了這個設定。
所以,設置URIEncoding解決get中的參數問題,配置過濾器解決post的參數問題;或者設置useBodyEncodingForURI為true,get、post都使用過濾器來解決參數問題。
2、數據庫bean配置
主要針對與數據庫交互時產生的亂碼問題,例如插入中文記錄或讀取中文數據。
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/newfang?useUnicode=true&characterEncoding=gbk&autoReconnect=true</value>
</property>
3、代碼中局部解決亂碼問題
主要用於解決個別亂碼問題,例如網頁顯示時中文均顯示正常除一兩條語句外,那么針對這一兩條語句的亂碼問題可用該方法。
qString = new String(qString.getBytes("ISO8859_1"), "GBK");
或 qString = URLEncoder.encode(qString, "GBK"); //java url 編碼方法
4、web.xml配置,添加filter過濾器
用於處理全站亂碼問題,其實主要也是用於action與jsp頁面交互時使用。
<!-- 用於解決中文亂碼問題 -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.qa.util.SetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
SetEncodingFilter代碼:
package com.qa.util;
import javax.servlet.*;
import java.io.*;
public class SetEncodingFilter implements Filter
{
protected String encoding=null;//定義缺省字符編碼方式
protected boolean ignore=true;//定義客戶端指定的編碼方式是否應被忽略
protected FilterConfig filterConfig=null;//定義過濾器配置對象,若為null,則說明過濾器未配置
public void destroy()//停止過濾器的工作
{
this.encoding=null;
this.filterConfig=null;
}
//設置字符編碼
public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)
throws IOException,ServletException
{
if(ignore||(req.getCharacterEncoding()==null))
{
req.setCharacterEncoding(selectEncoding(req));
}
chain.doFilter(req,res);
}
//啟動過濾器
public void init(FilterConfig filterConfig)throws ServletException
{
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
String value=filterConfig.getInitParameter("ignore");
if(value==null) this.ignore=true;
else if(value.equalsIgnoreCase("true")
||value.equalsIgnoreCase("yes")) this.ignore=true;
else this.ignore=false;
}
//選擇合適的字符編碼方式
protected String selectEncoding(ServletRequest req)
{
return this.encoding;
}
//返回filterConfig對象
public FilterConfig getFilterConfig()
{
return filterConfig;
}
//設置filterConfig對象
public void setFilterConfig(FilterConfig filterConfig)
{
this.filterConfig=filterConfig;
}
}
5、服務器apache上的亂碼。
除了以上的情況外,還有apache的配置問題,注意的方面有以下幾點:
1)conf/httpd.conf
把AddDefaultCharset ISO-8859-1 改成 AddDefaultCharset GBK
2)apache進行了rewrite
把需要rewrite的url中的中文參數進行兩次編碼(encode),因為apache在rewrite時會做一次url解碼,這時jk進行請求轉發時,就不會再是編碼后的字符串了;
或者在接收請求時先用ISO-8859-1取字節流,再使用UFT-8來new String。(new String(str.getBytes("ISO-8859-1"),"UFT-8"))