說明:下文涉及的內容只限于對前端jsp和后臺servlet的代碼修改,不涉及Web容器和數據庫的相關修改。
我的測試環境是:英文XP操作系統,容器采用Tomcat6,前臺是jsp,后臺Servlet,Ajax框架采用prototype1.6.0
Web編程中前后端亂碼問題發生的根源:
從前端jsp到后臺的Servlet,中間傳輸過程中的默認編碼方式是ISO-8859-1,這種編碼方式是西歐字符集,包括英語,德語,丹麥語,芬蘭語等,其它語言如中文日文等是不兼容的,如不經轉換或是設置直接在Servlet中用request.getParameter(paramName)這種方式直接拿出來中文部分就會得到亂碼,但英語,字母,數字組合成的字符串是不會變成亂碼的。
常見的編碼解決亂碼問題的方式有:
如果是將form通過post方式提交,在servlet的doPost函數開頭(對于Struts寫在execute函數開頭)寫上request.setCharacterEncoding("jsp網頁字符集")就可以直接用request.getParameter(paramName)直接得到文字,不需要經過再轉碼。這里需要注意的是form的action如果不直接寫成post的話,是會以get方式提交,這時request.setCharacterEncoding就會失效。
如果不管是post還是get方式,想做一個通用方案,則可以通過new String(request.getParameter(paramName).getBytes("ISO-8859-1"),"jsp網頁編碼方式")得到轉碼后正常的文字,這種方式只要知道網頁的字符集,幾乎都能還原成正確的文字,適用性很廣,在Servlet和Action中很常見。
如果是Ajax提交方式,則在servlet或是action中書寫request.setCharacterEncoding("jsp網頁字符集")是沒有效果的,經過對提交的URL用一次javascript的encodeURI函數編碼后,用 new String(request.getParameter(paramName).getBytes("ISO-8859-1"),"jsp網頁字符集")可以得到正確的文字。但如果不用encodeURI函數處理提交的url則不會正確的文字。
Ajax提交中文的另一種方式可以用javascript的encodeURI函數對提交的URL進行兩次編碼,而后臺采用URLDecoder.decode(request.getParameter(paramName), "UTF-8")得到正確的文字。
上面兩種方式都借助了avascript的encodeURI函數的幫助,它能將字符串進行utf-8編碼,其中,第二種方式確定性很高,推薦。
具體方式請參考下面給出的例程,里面含有12個例子,分別對應了多種情況:
http://www.tkk7.com/Files/heyang/DisorderCode2011-01-31.zip

參考文章:
深入淺出 web 編碼(轉載整理)
http://www.tkk7.com/heyang/archive/2011/01/26/343570.html
我的測試環境是:英文XP操作系統,容器采用Tomcat6,前臺是jsp,后臺Servlet,Ajax框架采用prototype1.6.0
Web編程中前后端亂碼問題發生的根源:
從前端jsp到后臺的Servlet,中間傳輸過程中的默認編碼方式是ISO-8859-1,這種編碼方式是西歐字符集,包括英語,德語,丹麥語,芬蘭語等,其它語言如中文日文等是不兼容的,如不經轉換或是設置直接在Servlet中用request.getParameter(paramName)這種方式直接拿出來中文部分就會得到亂碼,但英語,字母,數字組合成的字符串是不會變成亂碼的。
常見的編碼解決亂碼問題的方式有:
- new String(request.getParameter(paramName).getBytes("ISO-8859-1"),"頁面字符集");
- HttpServletRequest.setCharacterEncoding("頁面字符集");
- URLDecoder.decode(str, "UTF-8");
如果是將form通過post方式提交,在servlet的doPost函數開頭(對于Struts寫在execute函數開頭)寫上request.setCharacterEncoding("jsp網頁字符集")就可以直接用request.getParameter(paramName)直接得到文字,不需要經過再轉碼。這里需要注意的是form的action如果不直接寫成post的話,是會以get方式提交,這時request.setCharacterEncoding就會失效。
如果不管是post還是get方式,想做一個通用方案,則可以通過new String(request.getParameter(paramName).getBytes("ISO-8859-1"),"jsp網頁編碼方式")得到轉碼后正常的文字,這種方式只要知道網頁的字符集,幾乎都能還原成正確的文字,適用性很廣,在Servlet和Action中很常見。
如果是Ajax提交方式,則在servlet或是action中書寫request.setCharacterEncoding("jsp網頁字符集")是沒有效果的,經過對提交的URL用一次javascript的encodeURI函數編碼后,用 new String(request.getParameter(paramName).getBytes("ISO-8859-1"),"jsp網頁字符集")可以得到正確的文字。但如果不用encodeURI函數處理提交的url則不會正確的文字。
Ajax提交中文的另一種方式可以用javascript的encodeURI函數對提交的URL進行兩次編碼,而后臺采用URLDecoder.decode(request.getParameter(paramName), "UTF-8")得到正確的文字。
上面兩種方式都借助了avascript的encodeURI函數的幫助,它能將字符串進行utf-8編碼,其中,第二種方式確定性很高,推薦。
具體方式請參考下面給出的例程,里面含有12個例子,分別對應了多種情況:
http://www.tkk7.com/Files/heyang/DisorderCode2011-01-31.zip
參考文章:
深入淺出 web 編碼(轉載整理)
http://www.tkk7.com/heyang/archive/2011/01/26/343570.html