中文亂碼解決方案

2021-06-21 01:05:49 字數 4609 閱讀 1331

前言:亂碼問題,一直使我們頭疼的問題。今天自己有空好好研究一番。不求太深入,只求只知皮毛。考慮不夠全面,只求給您一點幫助足矣。

一、簡單介紹下pageencoding與contenttype的區別(摘自網上)

pageencoding:設定jsp原始檔和響應正文中的字符集編碼。

contenttype:設定jsp原始檔和響應正文的字符集編碼及mime型別。

如果pageencoding屬性存在,那麼jsp頁面的字元編碼方式就由pageencoding決定,  

否則就由contenttype屬性中的charset決定,如果charset也不存在,jsp頁面的字元編碼方式就採用 預設的iso-8859-1。

二、環境測試演練

post請求

1、條件:html或者jsp中的charset :text/html;charset=gb2312 (即瀏覽器頁面編碼方式)

沒有filter,

server.xml沒有設定

比如request.getparamter ,"汪" 轉換成 íô    new string("汪".getbytes("gb2312"),"iso-8859-1")

結論:這是因為gb2312編碼的「汪」,經iso-8859-1編碼為íô.

因此需要轉換  new string("íô".getbytes("iso-8859-1"),"gb2312");

2、條件:在1的基礎上,server.xml增加   

uriencoding="gbk" usebodyencodingforuri="true" 不起作用。

並多次修改其值,對1中結果沒有影響。

結論:故推斷,此設定不對post請求起作用。

3、條件:在1的基礎上,增加fiter, request.setcharacterencoding("gb2312");

那麼request.getparameter("name"),直接獲得正常的值。

結論: request.setcharacterencoding 需要在request.getparameter("name")之前設定。具體可參考英文文件。

4、條件:在3的基礎上,修改request.setcharacterencoding("utf-8");

那麼,漢字"汪"就不會正常解析出來,因為  "汪"先經過gb2312--->iso-8859-1---->utf-8 編碼

若反過來,是不可逆的。錕斤拷  new string(new string(name.getbytes("utf-8"),"iso-8859-1").getbytes("iso-8859-1"),"gb2312");

結論:因此不要設定兩個或者兩個以上不同的編碼,導致編碼複雜,可能造成不可逆。

get請求:

1、條件:jsp 中 pageencoding="utf-8" charset=utf-8",filter中 request.setcharacterencoding("utf-8");  

/login.do?method=validate&username=汪&password=121322"">測試

分析:汪----utf-8----iso-8859-1----request.setcharacterencoding("utf-8") 不起作用--   

因此 string name=new string(request.getparameter("username").getbytes("iso-8859-1"),"utf-8");才能顯示正常的中文。

2、瀏覽器位址列手動敲鏈結

那麼汪---gbk---iso-8859-1

因此string   name=new string(request.getparameter("username").getbytes("iso-8859-1"),"gbk");為正常中文。

3、在1的基礎上,

3.1)去除過濾器filter  

3.1.1)只有 uriencoding="utf-8"

"汪"------utf-8----iso-8859-1---通過tomcat server.xml ---utf-8

因此request.getparameter("username")為正常中文。

3.1.2) 只有usebodyencodingforuri="true"

同3.1.3

3.1.3)server.xml 增加uriencoding="utf-8" usebodyencodingforuri="true"  

汪----utf-8----iso-8859-1

因此 string  name=new string(request.getparameter("username").getbytes("iso-8859-1"),"utf-8"); 為正常中文

3.2)增加過濾器filter  request.setcharacterencoding("utf-8")

3.2.1)只有 uriencoding="utf-8"

"汪"------utf-8----iso-8859-1---通過tomcat server.xml ---utf-8,注意filter不起作用

因此request.getparameter("username")為正常中文。

3.2.2) 只有usebodyencodingforuri="true"

"汪"------utf-8----iso-8859-1---過濾器 ---utf-8

因此request.getparameter("username")為正常中文。 即同3.1.1

3.2.3)server.xml 增加uriencoding="utf-8" usebodyencodingforuri="true"  

同上4、在2的基礎上 

4.1)去除過濾器fiter

4.1.1)只有 uriencoding="utf-8"

汪------gbk-----iso-8859-1---通過tomcat server.xml ---utf-8 

request.getparameter("username"); 亂碼。 若逆向編碼的不可逆,

new string(new string(request.getparameter("username").getbytes("utf-8"),"iso-8859-1").getbytes("iso-8859-1"),"gbk")----錕斤拷

4.1.2)只有usebodyencodingforuri="true"

同4.1.3

4.1.3)server.xml 增加uriencoding="utf-8" usebodyencodingforuri="true"

汪------gbk-----iso-8859-1

因此 name=new string(request.getparameter("username").getbytes("iso-8859-1"),"gbk");

4.2)增加過濾器request.setcharacterencoding("utf-8");

4.2.1)只有 uriencoding="utf-8"

汪------gbk-----iso-8859-1---通過tomcat server.xml ---utf-8 

request.getparameter("username"); 亂碼。 若逆向編碼的不可逆,

new string(new string(request.getparameter("username").getbytes("utf-8"),"iso-8859-1").getbytes("iso-8859-1"),"gbk")----錕斤拷

4.2.2)只有usebodyencodingforuri="true"

同4.1.1

4.2.3)server.xml 增加uriencoding="utf-8" usebodyencodingforuri="true"

同上5、server.xml 增加uriencoding="utf-8" usebodyencodingforuri="true",無論設不設定過濾器,多次修改uriencoding="utf-8"的編碼。

對結果無影響,usebodyencodingforuri 優先級別比增加uriencoding 高。

總結:1)request.setcharacterencoding;只對post請求、get請求(server.xml中配置usebodyencodingforuri="true")起作用。

2)server.xml 增加uriencoding="utf-8" usebodyencodingforuri="true" 只對get請求起作用。

3)位址列手動鏈結。根據系統編碼gbk----iso-8859-1

4)request.setcharacterencoding 應該設定在request.getparameter之前。

5)對server.xml只有uriencoding="utf-8"配置的情況下。 會對get請求uri進行utf-8編碼

6)若usebodyencodingforuri="true" 優先順序比uriencoding="utf-8"高。即設定前者後,後者不起作用。

因此建議最好 jsp 中pageencoding,contenttype,server.xml  uriencoding="utf-8" usebodyencodingforuri="true"  fileter為request.setcharacterencoding,保持一致。

MYSQL中文亂碼解決方案

mysql資料庫存在著編碼問題,主要體現在資料庫裡漢字會出現亂碼,web頁面漢字顯示不正常。歸結起來只有乙個原因 會出現編碼的地方存在編碼不一致。web開發中 mysql編碼主要會出現在五個地方 1.mysql安裝的預設編碼 latin1 在mysql.ini mysql安裝根目錄下 中設定。mys...

POST中文亂碼解決方案

以前,我都是自己編寫乙個filter,來實現編碼,如下 public class characterencodingfilter implements filter override public void dofilter servletrequest request,servletrespons...

mycat中文亂碼 解決方案

亂碼問題可能出現的三個地方 1 程式連線的編碼要設定 jdbc mysql 2 mysql資料庫的編碼要設定 1 檢視mysql server級別的編碼集 首先進入mysql使用命令 mysql uroot p 然後執行命令檢視 show variables like character varia...