js post傳遞中文參數到java後臺出現亂碼

項目中遇到傳遞中文參數的問題,這個問題可以利用編碼、解碼解決。

方案:兩次編碼,一次解碼。

編碼:

var params = encodeURI(encodeURI("中文"));

把中文編碼成由英文數字以及支付組成的一串code.


java端解碼:

//params 就是“中文” 

params =  java.net.URLDecoder.decode(params , "UTF-8");


爲什麼要編碼兩次,而解碼只需要一次?

因爲servlet在接收參數的時候就會自動解碼一次,並且默認是以ISO-8859-1進行解碼的,所以前臺需要編碼兩次,後臺只需要手動用UTF-8解碼一次。


使用兩次編碼的過程相當於如下代碼:

String name;
                name = java.net.URLEncoder.encode("測試", "UTF-8");
System.out.println(name);
       name=java.net.URLEncoder.encode(name,"UTF-8");
       System.out.println(name);
       String NameUTF8=java.net.URLDecoder.decode(name, "UTF-8"); // 這行和name=java.net.URLDecoder.decode(name, "ISO-8859-1");結果一致
       String NmaeISO88591 = java.net.URLDecoder.decode(name, "ISO-8859-1");
       System.out.println("NameUTF8=    "+NameUTF8);
       System.out.println("NmaeISO88591="+NmaeISO88591);
       System.out.println(name);
       System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));

輸出爲:

%E6%B5%8B%E8%AF%95
%25E6%25B5%258B%25E8%25AF%2595
NameUTF8=        %E6%B5%8B%E8%AF%95
NmaeISO88591=%E6%B5%8B%E8%AF%95  (NameUTF8與NmaeISO88591結果是一致的)
%25E6%25B5%258B%25E8%25AF%2595
%E6%B5%8B%E8%AF%95


第一次編碼後將漢字編碼爲%和字母數字的格式,而第二次編碼的時候是對%字母數字進行編碼,雖然解碼的時候使用的是ISO-8859-1,但是對於%和字母數字而言用ISO-8859-1和UTF-8解碼出來的是一樣的,此時就回到了漢字被編碼過一次的字符串了,當再次進行解碼的時候使用UTF-8就回將它轉會漢字。

發佈了74 篇原創文章 · 獲贊 88 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章