2007-04-10

Java Note : Form Encode for Tomcat 5

最近想要把運作中的 Tomcat 4.1 換成 Tomcat 5.0 在測試的環境中一換過去, 發生了編碼轉換上面的問題. 原本在4.1 中可以正常輸入中文到Server端, 但是5.0中卻發生亂碼的問題. 解決 Tomcat 5.0.19 中文參數傳遞問題這一篇的討論中, 說明了 5.0 在處理 Reuqest QueryString 的編碼的差異性. 其中比較大的差異性在5.0 將QueryString 拿出來編碼, 如果沒有特別指定編碼的話就會以ISO-8859-1來編碼.
總結文章裡面的說法, 寫了一個簡單的測試網站來做實驗. 歸納下來解題的重點主要是放在兩個地方, 一個是 URL 裡面的編碼, 另一個是在request 的內容編碼.
首先, 在一般的HTML Form 裡頭傳送資料的方式有 Get and Post. Get 主要是將要傳送的資料附加在URL後面(Example: http://www.google.com/search?Key=ABC). Post 則是將要傳送的資料附加在Request 最後面的一個地方. 在5.0預先的編碼方式就是用ISO-8859-1, 如果你在取資料的時候沒有特別註明編碼, 就會得到ISO-8859-1的編碼資料. 所以, 最簡單的解決方式就是 request.setCharacterEncoding("Big5"), 但是在5.0裡面這樣只是用在Post的方式, Get的會因為QueryString被分開處理, 所以並不能正確的轉換到正確的編碼. 所以要解決Get 的編碼問題, 就必須動到URIEncode, 讓server將收到的request URL 做相對的編碼, 整個解法就是圍繞在這裡.

解法:
1. Get Method : 運用URIEncoding來解決, 由server針對URL 預先編碼.
2. Post Method : 運用 request.setCharacterEncoding 來對request 內容編碼.

實驗內容:
1. 只使用 request.setCharacterEncoding 是否就可以解決問題?
2. 只使用 URIEncoding 是否就可以解決問題?
3. request.setCharacterEncoding and URIEncoding 並用來解決問題?

實驗設計:
1. 只用 request.setCharacterEncoding 觀察 Get and Post.
2. 只用 URIEncoding 觀察 Get and Post.
3. request.setCharacterEncoding and URIEncoding 觀察 Get and Post.
4. 運用 SetCharacterEncoding Filter 省去 request.setCharacterEncoding.

實驗結果:
1. 沒有在server.xml 加入 URIEncoding Tag, 在 .jsp 中加入 request.setCharacterEncoding .
a. Get : Normal 亂碼, String.encode 正常.
b. Post : Normal 正常, String.encode 亂碼.
2. 在server.xml 加入 URIEncoding Tag, 在 .jsp 中加入 request.setCharacterEncoding.
a. Get : Normal 正常, String.encode 亂碼
b. Post : Normal 正常, String encode 亂碼

3. 在web.xml 裡頭 加入SetCharacterEncoding Filter.
結果與 實驗二相同.

結論:
1. 針對Post 的採用 CharacterEncoding, 建議加在Filiter裡頭.
2. 針對Get 才用URIencoding 方式, 可以免除在程式中做轉碼動作.

設定 URIEncoding 範例: 找到Tomcat\conf\server.xml 裡頭 Connector 的tag 加入 URIEncoding="${EncodeCode}"

minSpareThreads="25" maxSpareThreads="75" maxThreads="150" maxPostSize="0" URIEncoding="Big5">



設定 SetCharacterEncoding Filter 範例: 找到Tomcat\webapps\${site}\WEB_INF\web.xml 加入.


SetCharacterEncoding
filters.SetCharacterEncodingFilter

encoding
Big5



SetCharacterEncoding
/*

沒有留言:

張貼留言