今天一個朋友又問及url傳遞中文參數,jsp接收參數時的亂碼處理問題。
一、問題如下:
Js提交代代碼:
Var name = "老羅";
var url = "testList.jsp?userName="+name;
Jsp中接收參數代碼:
String userName = request.getParameter("userName");
得到的userName結果成了“?”
二、我給他的解決辦法如下:
Js提交代代碼:
Var name = "老羅";
var url = "testList.jsp?userName="+name;
url=encodeURI(url);
url=encodeURI(url);
Jsp中接收參數代碼:
String userName = request.getParameter("userName");
userName = java.net.URLDecoder.decode(userName ,"UTF-8");
得到的userName結果:“老羅”
在這裏,爲什麼要在客戶端對字符串重複編碼兩次呢,
因爲第一次編碼,參數內容便不帶有多字節字符了,成了純粹的 Ascii 字符串。
再編一次後,提交,接收時容器自動解一次。
然後,再在程序中實現一次 java.net.URLDecoder(***, "UTF-8")) 就可以得到想提交的參數的原值。
其實,一般情況下,
encodeURI使用的是 UTF-8 編碼規則來編的.
如果 request.getParameter(paramName) 時,容器也按 UTF-8 解的話,是正確的. 根本無須在客戶端進行二次的 encodeURI(...)
如果 request.getParameter(paramName),容器沒有按 UTF-8 解的話, 結果只有一個,就是亂碼!
容器按什麼編碼來解碼,決定於 request.setCharacterEncoding(***) 或者 服務器程序配置.
在 jsp 程序中,能夠 request.setCharacterEncoding("UTF-8"), 並且 修改服務器配置,讓容器在解 GET 提交的參數時,使用 UTF-8.
客戶端提交前不用二次編碼, 接收時,也只要直接 request.getParameter(paramName) 即可