JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Application Server » Tomcat  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 解決 Tomcat 5.0.19 中文參數傳遞問題 [精華]
精靈





發文: 86
積分: 7
於 2004-04-14 02:07 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
實際運用 Tomcat 5.0.19,我們了解在不修改 Tomcat 原始碼的狀況下,使用者透過 Form submit 的資料將一律以 ISO8859-1 處理,程式設計師必須自行將字串將轉換為 Big5(繁體中文) or GB2312/GBK(簡體中文),我們在應用程式中,對所有的 request.getParameter("xx"); 作了 toBig5String() 的處理,理論上,所有的中文問題應該不會出現才對,結果,還是發現某些狀況下,中文還是變成亂碼!

經過分析整理,我們發現問題出在 QueryString 的解析,以前在 Tomcat 4.x 時代,無論 SUBMIT 時採用 GET or POST,Tomcat server 對 parameters 的處理都採用相同的編碼,但在 Tomcat 5.x 版,不知何故,卻將 QueryString 的解析獨立出來,目前確認,Form 的 Method 採用 GET 及直接將參數寫在 URL 上的中文,上傳到 Tomcat 時,無論如何轉碼,都會變成亂碼,那怕你事先作過 URLEncode 也一樣。

網站上,有人針對這個問題,建議將所有中文改採用 base64 編碼,到了 server 上,程式將自行土 base64 decode 回來,確保中文不會發生問題。這樣作法當然可以解決這個問題,但是所有網頁變成限定要採用 POST,且程式設計師要隨時分清楚,那個參數是採用 GET 上傳,那個參數是採用 POST 上傳,然後再針對不同的方式採用不同的解析,這樣的程式一點兒移植性都沒有,更別提跨平台、跨國際語言了。

研究 Tomcat 的文件及原始碼,我們找到了問題所在及解決的方法,只有按著以下的作法,才能使 Form submit 的資料完全按著 ISO8859-1 的編碼,當然,若是全照著 Tomcat 的文件說明去作,肯定還是不行,你還是得加上這個參數到 server.xml 中才行。

解決方案

請先研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html 這個說明檔,擷錄重點如下:
URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

useBodyEncodingForURI:This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitely set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.

上述二個 Tomcat 參數,是設定在 server.xml 中的 http <Connector /> 區塊,要解決 QueryString 中文變成亂碼的問題,你必須至少設定這二個參數其中之一。
URIEncoding 請設定為 URIEncoding="ISO-8859-1" 指定為 "ISO-8859-1" 編碼,讓 QueryString 的字元編碼與 post body 相同。
useBodyEncodingForURI 這是用來相容 Tomcat 4.x 版的,設定的值是 "true" or "false",意思是指 "要不要讓 QueryString 與 POST BODY 採用相同的字元編碼 ?",若是設成 true,那也可達到 "ISO-8859-1" 編碼的需求。
建議,採用 URIEncoding 的設定,畢竟 useBodyEncodingForURI 的作法是為了相容 Tomcat 4.X。不過若照原文的說明,理論上這二個參數都不設,Tomcat 也該採用 "ISO-8859-1" 的編碼,那為什麼還是會有問題呢 ? 我們由 Tomcat Source Code 來看就清楚了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 這一段碼是 Tomcat 用來解 QueryString 的程式,
// 在 org.apache.tomcat.util.http.Parameters 這個 class 裡。
private String urlDecode(ByteChunk bc, String enc)
  throws IOException {
  if( urlDec==null ) {
     urlDec=new UDecoder(); 
  }
  urlDec.convert(bc);
  String result = null;
  if (enc != null) {
    bc.setEncoding(enc);
    result = bc.toString();
  } 
  else {
    CharChunk cc = tmpNameC;
    cc.allocate(bc.getLength(), -1);
    // Default encoding: fast conversion
    byte[] bbuf = bc.getBuffer();
    char[] cbuf = cc.getBuffer();
    int start = bc.getStart();
    for (int i = 0; i < bc.getLength(); i++) {
      cbuf[i] = (char) (bbuf[i + start] & 0xff);
    }
    cc.setChars(cbuf, 0, bc.getLength());
    result = cc.toString();
    cc.recycle();
  }
  return result;
}

請特別注意紅色區塊,當 Tomcat 發現 QueryString 並沒有設定 encode 時,並非像文件中所說預設採用 ISO-8859-1 的編碼,而是用一段 fast conversion 來處理,才會造成中文問題,所以,還是必須在 Server.xml 中,加上 URLEncoding 的參數設定才行哦。

Connector 的設定範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="ISO-8859-1"
>
</Connector>


browser edited on 2004-04-14 02:22
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
114557 [精華] 解決 Tomcat 5.0.19 中文參數傳遞問題 精靈 3302 2004-04-14 02:07
108434 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 browser 685 2004-04-14 02:40
97238 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 sindylee 163 2004-07-14 17:21
91636 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 Sovina 386 2005-02-06 01:26
91552 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 EVAzero 2025 2005-03-24 10:45
89150 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 bmilk 74 2005-03-30 17:09
89084 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 多多 297 2005-04-05 09:17
88878 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 swpoker 177 2005-04-06 17:11
88426 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 valueyao 105 2005-04-13 10:04
88115 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 Nievor 1071 2005-04-25 16:54
87711 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 lin0_o 1479 2005-05-06 16:05
85968 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 rueitsung 452 2005-06-20 15:10
73017 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 bgyeats 406 2006-04-12 09:29
71509 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 bee 2118 2006-06-10 11:40
70298 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 magus0803 908 2006-06-23 22:33
98438 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 發條盒子 148 2004-04-16 01:05
65261 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 tomto 10 2006-10-27 08:53
63440 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 javalien 397 2007-01-18 17:49
47733 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 Happy漫步者 45 2008-01-13 03:02
37819 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 iseehk 20 2008-12-30 17:50
98018 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 jan 451 2004-05-07 16:04
98047 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 browser 518 2004-05-07 16:25
32553 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 c_c_lai 60 2009-11-21 15:47
97952 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 plutotw 71 2004-05-09 17:43
97489 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 senshaw 38 2004-06-12 18:55
96525 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 hcl 151 2004-07-16 13:09
94863 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 Jill_Yeh 365 2004-09-02 13:45
95780 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 prf 10 2004-08-16 11:05
94430 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 shirley_wang 125 2004-09-21 15:39
91925 Re:解決 Tomcat 5.0.19 中文參數傳遞問題 rawhead 412 2005-01-15 21:24
» JWorld@TW »  Application Server » Tomcat

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8