tomcat下jsp亂碼原因(下)

系列文章: tomcat下jsp亂碼的原因

上一篇文章裡面, 主要講解瞭文件編碼、頁面編碼、如何解碼, 以及分析瞭tomcat所起到的作用,
猛戳這裡詳細瞭解 tomcat下jsp亂碼的原因(上)

tomcat下jsp亂碼原因(下) ,這裡我們分為以下幾點講解下解決亂碼的方式, 都是結合tomcat來的。

1、純手工解碼

2、setEncoding

3、get、post方法

4、通過配置tomcat參數

好瞭, 我們詳細看看以上幾個方法

1、純手工解碼

這個方式, 我們上篇文章已經做瞭比較詳細的描述, 之所以放到這裡再講一遍主要是和其他幾種方式可以有個對比。
例如:

String abc1 = new String(abc.getBytes("ISO-8859-1"),"utf8");  

這個方法就是把iso8859編碼格式的字符串解碼成utf8格式的字符串。 之所以稱之為純手工的方法, 是因為這個采用這種方式方法的話, 你不得不在你所有
采集參數的地方手工轉換這個

String abc1 = new String(abc.getBytes("ISO-8859-1"),"utf8");

都要寫這句話, 是不是很麻煩。 “懶惰”的程序員才是好程序員:有什麼好辦法嗎?

2、setEncoding

讓我們回顧下上篇文章中,tomcat的源碼。

    String encoding = getCharacterEncoding();  
    if (encoding == null)  
        encoding = "ISO-8859-1";  
    try{  
        RequestUtil.parseParameters(queryParameters, queryParamString, encoding);  
    }catch (Exception e){  
        ;  
    }  

這裡我們首先看到tomcat默認把字符串設置成瞭iso8859, 但是是在getCharacterEncoding() 麼有取到值的時候, 所以, 我們就有瞭一個比較簡單的辦法處理這個問題

1、在String abc = request.getParameter(“abc”);之前, 我們就可以寫添加一句代碼, 用來專門設置request的encoding, 這樣tomcat在getCharacterEncoding()的時候

就可以取到我們定義的encoding,代碼就是這樣:

 request.setCharacterEncoding("utf8");
 String abc = request.getParameter("abc");

2、上述代碼中的abc直接就是utf8編碼瞭。 如果我們提交以前也是utf8編碼的, 這樣獲取的直接就是對的編碼瞭。是不是第一種方法裡面, 每個字符串都去編碼下要簡潔很多?更進一步, 我們可以使用一個更有效的方法filter。 可以定義一個filter, 專門做這個request.setCharacterEncoding(“utf8”); , 當然我們在每個jsp, 或者servlet中, 或者

action中, 就不用處理這個encoding, 這樣更有利於統一處理編碼, 當然如果做的更靈活可以把request.setCharacterEncoding(“utf8”);中的utf8做成參數話, 這樣就更

靈活, 可以隨時修改而不用重新編譯程序瞭。

是不是更符合懶惰的思想作風, 呵呵, 確實比第一種方法簡潔瞭很多。 但是這也是一把雙刃劍, 簡潔的同時,也隱藏瞭很多的內容, 很多項目裡面大部分的人都是針對業務的, 如果沒有接觸的話, 那麼很可能搞不清中間還有這些轉換的事情的發生, 所以作為一個程序員應該提高自身的素質, 而不是僅僅的完成任務, 好瞭這個已經超出瞭我們的范圍瞭。 好瞭說瞭些廢話以後, 我們繼續回到主題上來。

上面我們已經從自己主動轉換編碼,到統一編碼, 那麼我們不禁要想瞭, 還有其他的方法嗎? 答案是肯定的, tomcat的大神門早就替我們考慮瞭這些問題, 隻是我們對它瞭解多少呢?下面我們先做些準備知識。

3、get、post方法

html的get和post的方法, 為啥要在這裡列出這個問題呢? 我們先看看2個截圖, 還是用上一篇文章中的test.jsp 和 result.jsp 作為例子:

首先我們test.jsp中設定成get的方法, 我們使用httpwatch 來觀察下ie瀏覽器做瞭些什麼?

首先我們test.jsp中設定成post的方法, 我們使用httpwatch 來觀察下ie瀏覽器做瞭些什麼?vcD4KPHA+PGltZyBzcmM9″/uploadfile/Collfiles/20141112/20141112090620161.jpg” alt=”\”>

通過以上2附圖,可以很清楚的看到我們的test.jsp的提交時候的變化。 一個參數在head, 一個參數在body。 (註:這個也是post可以數據更長的原因, 而get是有限制的)
有瞭這個基本的認識, 我們回到主題, 看看tomcat究竟怎麼幫助我們處理這個編碼問題。

4、通過配置tomcat參數

tomcat在這個問題上, 把get和post方法分開處理。我們隻需要修改相應的參數就可以。

參數的位置和名稱分別是config/server.xml

 

裡面添加參數:

URIEncoding=“gbk”

是設置get時候的url編碼的。

下面我們分別演示如何使用:

    

這裡我們把server.xml的urlencoding設置成gbk, test.jsp編碼目前也是gbk, 這時候是告訴tomcat說, 我的get方式的url參數是用gbk方式編碼的。看一下結果:

當result.jsp是這樣定義的:

 String abc = request.getParameter("abc");
 if(abc == null) {
   out.println("空值");
  }
  else 
  {  
    out.println("原始編碼:");
    out.println(abc);  
    out.println(java.util.Arrays.toString(abc.getBytes("ISO-8859-1"))); 
    out.println(new String(abc.getBytes("ISO-8859-1")));
    out.println("
"); out.println("utf8編碼:"); String abc1 = new String(abc.getBytes("ISO-8859-1"),"utf8"); System.out.println(abc1); out.println(abc1); out.println("
"); out.println("gbk編碼:"); String abc2 = new String(abc.getBytes("ISO-8859-1"),"gbk"); out.println(abc2); }

對應代碼和結果, 我們可以清楚的看到, 我們再使用iso8859方式進行解碼的時候, 都出錯瞭。 但是直接獲取參數時候, 確實沒有亂碼。

好下面我們把test.jsp的方式改成post, result.jsp的方式不該, 我們看看結果:

可以看出這個地方的參數設置是針對get方式起效。

絮絮叨叨又寫瞭這麼多, 其實還有很多細節看樣子也沒有辦法一下子就涉及到並且講清楚。 以後有機會再說。 歡迎交流

發佈留言