引子
我們在測試的時候經(jīng)常遇到前后臺文件的編碼明明都一樣,但get或post到后臺,或者響應數(shù)據(jù)到前臺后,接受到的中文字符卻都是亂碼,而這個時候如果恰巧對編碼沒有一定的理解那么真是一種丈二和尚摸不著頭腦的感覺了羡微。
那么就說下編解碼的問題,我們知道瀏覽器與服務器后臺之間通訊是通過傳輸字節(jié)流也就是一堆0和1惶我,所以我們?yōu)g覽器就會按照你html的編碼格式(如utf-8)妈倔,對照編碼表將字符編碼成字節(jié)流,然后再傳輸給后臺(servlet)绸贡,所以這個時候后臺就需要將其解碼還原成我們需要的字符盯蝴,問題就出現(xiàn)在這里了。
舉一個例子:html與Servlet文件格式都為UTF-8的情況听怕,怎么才能正確在后臺顯示中文呢捧挺。
post方法
Post的解決方法相對簡單。
post的數(shù)據(jù)是存儲在http協(xié)議的實體內(nèi)容里的尿瞭。
而HttpServletRequest提供了一個setCharacterEncoding()的方法可以直接設(shè)置編解碼格式松忍。
request.setCharacterEncoding("utf-8");
這樣我們再通過getParameter()方法獲取post的內(nèi)容時候就可以正確顯示了。
Get方法的解決措施
Get有所不同筷厘。
我們知道get方法傳輸?shù)臄?shù)據(jù)是存儲在HTTP協(xié)議的請求行 'uri'(也可以理解為url)中的鸣峭。
但是tomcat服務器默認是把uri中部分的字節(jié)流直接當成"iso-8859-1"編解碼的。
我們獲得get的數(shù)據(jù)一般通過
Stirng paramValue=request.getParameter(paramName);
來獲得我們需要的數(shù)據(jù)值酥艳。
所以當然會出問題了摊溶,因為iso-8859-1不支持中文嘛。
我們這個時候只能先把得到的亂碼數(shù)據(jù)手動用iso-8859-1的編碼方式解碼得到字節(jié)流充石,然后再把字節(jié)流按照utf-8碼表編碼成字符莫换,即得到我們要的正確字符!
方法如下:
//手動解碼
paramValue = paramValue.getBytes("iso-8859-1");
//再次編碼
paramValue = new String(paramValue ,"utf-8");
然后就搞定了骤铃!
這個時候控制臺輸出一下看到的就是中文而不是亂碼了拉岁。