上次提出了一個ajax下載中文編碼問題,這次有遇到了ajax的上傳中文亂麻問題 繼續(xù)bs各種編碼:) 遇到問題:在使用xhr發(fā)出請求時,請求的url中參數(shù)帶中文,這時在后臺解析request得不到中文 如: request = new ActiveXObject("Microsoft.XMLHTTP"); request.open("GET", url);中我的url需要帶中文參數(shù) 直接加參數(shù)是在后臺解析不出來的,所以我使用方法對url進行編碼轉(zhuǎn)換 request = new ActiveXObject("Microsoft.XMLHTTP");
然后就要在后臺進行解碼了request.open("GET", uriFunc()); //省略了對象定義 // ![]() function uriFunc() { var separator = "?"; if (uri.indexOf("?") >= 0) separator = "&"; return uri + separator + paramName + "=" + escape(inputField.value,‘utf-8‘); } 以為沒法直接從request中取到編碼字符串,所以使用方法先取出url,然后再取出url的參數(shù)進行解碼 取出url,以及取參數(shù)方法 String exfirstword = getUrlParameter(unescape(request.getQueryString()),"excludeuser");
public String getUrlParameter(String str,String targetstr){ String[] stringarray = str.split("&") ; for(int i=0;i<stringarray.length;i++){ if(stringarray[i].startsWith(targetstr)){ stringarray=stringarray[i].split("="); break; } } return stringarray[1]; } //解碼方法 //以下是對js的escape進行解碼 private final static byte[] val = { 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F }; /** * 解碼 說明:本方法保證 不論參數(shù)s是否經(jīng)過escape()編碼,均能得到正確的“解碼”結(jié)果 * * @param s * @return */ public static String unescape(String s) { StringBuffer sbuf = new StringBuffer(); int i = 0; int len = s.length(); while (i < len) { int ch = s.charAt(i); if (‘A‘ <= ch && ch <= ‘Z‘) { // ‘A‘..‘Z‘ : as it was sbuf.append((char) ch); } else if (‘a‘ <= ch && ch <= ‘z‘) { // ‘a(chǎn)‘..‘z‘ : as it was sbuf.append((char) ch); } else if (‘0‘ <= ch && ch <= ‘9‘) { // ‘0‘..‘9‘ : as it was sbuf.append((char) ch); } else if (ch == ‘-‘ || ch == ‘_‘ // unreserved : as it was || ch == ‘.‘ || ch == ‘!‘ || ch == ‘~‘ || ch == ‘*‘ || ch == ‘\‘‘ || ch == ‘(‘ || ch == ‘)‘) { sbuf.append((char) ch); } else if (ch == ‘%‘) { int cint = 0; if (‘u‘ != s.charAt(i + 1)) { // %XX : map to ascii(XX) cint = (cint << 4) | val[s.charAt(i + 1)]; cint = (cint << 4) | val[s.charAt(i + 2)]; i += 2; } else { // %uXXXX : map to unicode(XXXX) cint = (cint << 4) | val[s.charAt(i + 2)]; cint = (cint << 4) | val[s.charAt(i + 3)]; cint = (cint << 4) | val[s.charAt(i + 4)]; cint = (cint << 4) | val[s.charAt(i + 5)]; i += 5; } sbuf.append((char) cint); } else { // 對應的字符未經(jīng)過編碼 sbuf.append((char) ch); } i++; } return sbuf.toString(); } 這時候得到的exfirstword 就是正確的中文了 問題解決 |
|