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

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