一般情況下url中文參數亂碼,只要設置好頁面編碼格式,然後把tomcat的server.xml設置一下就好了,但是現在這個項目因爲tomcat下面放的不止一個項目,改設置可能會引起其他項目的編碼問題,所以不能改,爲此頗糾結了一番,而網上很多方法就是用escape()、encodeURI()、encodeURIComponent()來編碼,然後去後天通過硬編碼new String(s.getBytes("iso-8859-1"),"gbk"); 但是很顯然 硬編碼是不行的,或者至少說不是通用的,換一個tomcat可能又錯了。上面的編碼方式只能把ISO的編碼轉成GBK,但是如果換一個tomcat,已經設置了UTF-8編碼,那麼這種編碼肯定會出錯。
1、ajax提交亂碼
提交方式1:
$.ajax({
url:'<%=basePath%>/pages/getInfo.do',
type: "POST",
data:'TXTCONTENT=updateContactToServer&userInfo='+userid+"&groupId="+zd,
success: function(jsonstr){
var uid = $("#hideUserId").val();
}
});
提交方式2:
$.ajax({
url:'<%=basePath%>/pages/getInfo.do?TXTCONTENT=updateContactToServer&userInfo='+userid+"&groupId="+zd,
type: "POST",
success: function(jsonstr){
var uid = $("#hideUserId").val();
}
});
以上兩種ajax提交方法如果參數userid是中文,那麼第一種提交方法不會有問題,而方法二會有問題,原因我不是很清楚,但是分析一下,應該是第二種提交方式把參數作爲URL 然後再tomcat中對URL用ISO-8859-1解碼,所以中文出現亂碼。而第一種提交方式中參數是在表單中提交,tomcat只對URL轉碼,所以中文參數不會出現亂碼。只是個人分析,如有錯誤,求高人指點!如果有人用ajax提交出現亂碼了,可以試試第一種方式提交一下。
2、普通的URL請求亂碼。
網上很多人給出escape()、encodeURI()、encodeURIComponent()的解決方法,具體三個方法我就不解釋了,網上很多。我想說的是 只用三個方法中的一個類似這樣
var url='<%=basePath%>/pages/deleteGroup.do?zdName='+encodeURIComponent(zdname)+"&groupId="+hideZD+"&count="+s; ;
window.location.href=url;
是不行的,到後臺依然會出現亂碼,必須用兩次
var url='<%=basePath%>/pages/deleteGroup.do?zdName='+encodeURIComponent(zdname)+"&groupId="+hideZD+"&count="+s; ;
window.location.href=encodeURI(url);
這樣在後臺纔不會出現亂碼,只不過我們在後臺要用URLDecoder.decode("zdname", "UTF-8");解碼一次!
原因分析:在頁面用encodeURIComponent或者encodeURI轉碼,能轉成十六進制的字符串,但是在往服務器傳遞過程中URL首先要經過tomcat 而tomcat會對URL解碼成中文,這樣tomcat再傳遞到後臺還是會出現中文亂碼,而用encodeURIComponent轉碼兩次的話,經過tomcat轉碼一次,還是十六進制字符串,在傳遞給服務器時接收的就還是轉碼後的字符串,然後我們在java代碼中用URLDecoder解碼一次就能出現正確中文了!
同時,如果是java代碼中使用httpclient的時候中的URL也可以URLEncoder和URLDecoder來轉碼和解碼,原理一樣。
結語: 關於URL亂碼的問題,網上很多都是講解encodeURIComponent 或者是通過new String(s.getBytes("iso-8859-1"),"gbk");來解決,以上兩種方法是我經過多次實驗後獲得的,原因分析可能不對,但是確實有用。如果對你有幫助,贊一個。