servlet 用get傳中文參數

from:
response.sendRedirect("./change?reason=" + URLEncoder.encode("售完", "UTF-8"));
ps.將中文轉為UTF-8的URL

to:
String reason = request.getParameter("reason");
reason = new String(reason.getBytes("iso-8859-1"),"UTF-8");
ps.接收端無法使用request.setCharacterEncoding("UTF-8")接收get過來的中文參數,只能使用getBytes



reference
http://openhome.cc/Gossip/Encoding/Servlet.html
原文轉貼如下:

請求參數的編碼處理,基本上必須分POST與GET的情況來說明,我們先來看POST的情況…

如果客戶端沒有在Content-Type標頭中設定字元編碼資訊(例如瀏覽器可以設定Content-Type: text/html; charset=UTF-8),此時使用HttpServletRequest的getCharacterEncoding()傳回值會是null,在這個情況下,容器若使用的預設編碼處理是ISO-8859-1(大部份瀏覽器預設的字元集)

你可以使用HttpServletRequest的setCharacterEncoding()方法指定取得POST請求參數時使用的編碼。例如若瀏覽器以UTF-8來發送請求,則你接收時也要使用UTF-8編碼字串,則可以在取得任何請求值之「前」,執行以下陳述:
request.setCharacterEncoding("UTF-8");

在HttpServletRequest的API文件中,對setCharacterEncoding()的說明清楚提到:
Overrides the name of the character encoding used in the body of this request.

也就是說,這個方法對於請求本體中的字元編碼才有作用,也就是基本上這個方法只對POST產生作用,當請求是用GET發送時則沒有定義這個方法是否會影響 Web容器處理編碼的方式(究其原因,是因為處理URL的是HTTP伺服器,而非Web容器)。

例如Tomcat在GET時,使用setCharacterEncoding()方法設定編碼就不會有作用,取得請求參數時仍會產生亂碼。

若你使用Tomcat並採用GET,或你沒有設定setCharacterEncoding(),且已取得一個請求參數字串,另外一個處理編碼的方式,則是透過String的getBytes()指定編碼來取得該字串的位元組陣列,然後再重新建構為正確編碼的字串。

例如若瀏覽器使用UTF-8處理字元,Web容器預設使用ISO-8859-1編碼,則正確處理編碼的方式為:
String name = req.getParameter("name");
String name = new String(name.getBytes("ISO-8859-1"), "UTF-8");


Tomcat 7不知道哪個版本開始,server.xml 中設定 <Connector URIEncoding="utf-8"...>…

以前版本的設定是  <Connector URIEncoding="iso-8859-1"...>,因此過去處理 GET 的中文亂碼時,可以 new String(param.getBytes("ISO-8859-1"), "your encoding") 來解決,不過如果 server.xml 中設定 <Connector URIEncoding="utf-8"...> 就不適用了,例如你是 Big5 的 URI 編碼過來的話,用 utf-8 來解釋,可能會沒有對應編碼,也就是顯示時會是「?」,這樣通常就沒救了 …

如果你以前就是用 new String(param.getBytes("ISO-8859-1"), "your encoding") 來處理 GET 時的亂碼,那就將 <Connector URIEncoding="utf-8"...>… 改回 <Connector URIEncoding="iso-8859-1"...> 就可以了…


<Connector URIEncoding="utf-8"...> 的設定,對於系統是 UTF-8 的倒是方便!

留言

這個網誌中的熱門文章

Java Servlet MVC web app

JavaMail透過Gmail寄信發生AuthenticationFailedException錯誤