本來以為把jsp版面設定為UTF-8,伺服器端用filter把request和response設定為utf-8,中文問題應該就差不多了。
但tomcat似乎中間給我我們加了步驟。
1 頁面
頁面中設定的編碼,我們post的資料就會按照頁面的編碼進行 encode,
比如 我們要post資料為 site=部落格園,如果我們的頁面為utf-8格式,
則實際post的資料為 site=%E5%8D%9A%E5%AE%A2%E5%9B%AD
java:URLEncoder.encode("部落格園", "utf-8"),
所以我們post給伺服器的資料會先經過頁面編碼的encode。
2 tomcat伺服器
當我們直接 request.getParameter(“site”);發現得到的字串為“?????????”,
因為tomcat自作聰明的把的字串當成iso8859-1來解碼了,
tomcat執行了類似:URLDecoder.decode(str, "iso8859-1");,因為jsp頁面預設的編碼就是iso8859-1,
就算你改了myeclipse的jsp頁面預設編碼,但tomcat的還是iso8859-1。
3 servlet
我們的servlet如何得到中文編碼呢?我們一步一步的加碼解碼即可:
URLEncoder.encode(str, "iso8859-1");//把tomcat給我們解碼的字串給加碼上
URLDecoder.decode(str, "utf-8");//把瀏覽器給我們加碼的資料解碼
總體過程:
//頁面 pageEncoding=utf-8String str = "部落格園";str = URLEncoder.encode(str, "utf-8");System.out.println(str);//output:%E5%8D%9A%E5%AE%A2%E5%9B%AD//tomcat str = URLDecoder.decode(str, "iso8859-1");System.out.println(str);//output:?????????// servletstr = URLEncoder.encode(str, "iso8859-1");System.out.println(str);//%E5%8D%9A%E5%AE%A2%E5%9B%ADstr = URLDecoder.decode(str, "utf-8");System.out.println(str);//部落格園
知道了tomcat加碼解碼過程,我們就可以徹底設定解碼方式了。
如果是get方式傳資料,可以設定解碼方式,
在tomcat的server.xml中 connector加上解碼方式:
<Connector port="8000" protocol="HTTP/1.1" URIEncoding="UTF-8" connectionTimeout="20000" redirectPort="8443" />
post還是使用filter + 手動解碼吧!