前言:亂碼問題,一直使我們頭疼的問題。今天自己有空好好研究一番。不求太深入,只求只知皮毛。考慮不夠全面,只求給您一點幫助足矣。
一、簡單介紹下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...