這個問題陸續遇到幾次了,始終知其然而不知其所以然。這是最近一次的處理案例:
環境
OS: CentOS 5.2 (utf-8)
Database: MySQL 5 (utf-8)
Application server: Tomcat 6
網頁
<input type=text name=keyword>
程式
String keyword=request.getParameter(“keyword”);
網頁的 input 輸入中文 submit 後由以上程式碼接取,原本的中文都變成亂碼。解決的方法是改用以下的接取程式碼,將收到的字串重新編碼。
String keyword=new String(request.getParameter(“keyword”).getBytes(“iso8859-1″),”utf-8”);
Why
Tomcat 在處理 GET、POST 參數時預設是採用 ISO-8859-1 編碼,請參考此 網址 URIEncoding 部份的說明,所以第2 段程式才會 work,請隨著您的作業系統及資料庫編碼設定,調整接取參數的程式碼。
Browser
以上的例子是送一個 keyword 到 tomcat web application 查詢資料,後來出現另一個問題,從 Firefox 送出中文的 keyword 可以正確的查到資料,Explorer 卻查不到,經過測試和查詢相關資料後發現,從 Explorer 送出 keyword 前要用 javascript encodeURIComponent() 編碼後再送出才會正常查到資料。
2008.11.27 加註
上面情形是發生在未指定 form 的 method,根據規格預設會以 get 傳送資料,Tomcat 的文件也沒有說明 URIEncoding 是會針對 get 或 post method 作處理。今天又遇到 form submit 中文亂碼問題,這次也不用重新編碼參數了,直接把 form method 設定 post,問題就解決了。看來 submit 的 form 有中文時,用 post method 會是比較好的選擇。
各種 Application Server URI encoding 的設定在這個 網址 有完整說明。