項目中遇到傳遞中文參數的問題,這個問題可以利用編碼、解碼解決。
方案:兩次編碼,一次解碼。
編碼:
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就回將它轉會漢字。