隨筆-55  評論-208  文章-0  trackbacks-0
          上次提出了一個ajax下載中文編碼問題,這次有遇到了ajax的上傳中文亂麻問題
          繼續bs各種編碼:)

          遇到問題:在使用xhr發出請求時,請求的url中參數帶中文,這時在后臺解析request得不到中文
          如:
          request = new ActiveXObject("Microsoft.XMLHTTP");
          request.open("GET", url);中我的url需要帶中文參數
          直接加參數是在后臺解析不出來的,所以我使用方法對url進行編碼轉換
          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的參數進行解碼
          取出url,以及取參數方法
          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?};

          ?????
          ??????
          /**
          ???????*?解碼?說明:本方法保證?不論參數s是否經過escape()編碼,均能得到正確的“解碼”結果
          ???????*
          ???????*?
          @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'..'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?{?//?對應的字符未經過編碼
          ??????sbuf.append((char)?ch);
          ??????}
          ??????i
          ++;
          ??????}
          ??????
          return?sbuf.toString();
          ??????}

          這時候得到的exfirstword 就是正確的中文了
          問題解決

          posted on 2006-05-25 20:49 rocket 閱讀(1958) 評論(3)  編輯  收藏

          評論:
          # re: ajax中文上傳編碼問題 2006-05-31 12:33 | arlen
          感謝. 可是為什么直接用中文就不可以呢??? 我得到得中文是gbk編碼的, 但是沒法轉成utf-8. 覺得跟很多因素有關系  回復  更多評論
            
          # re: ajax中文上傳編碼問題 2006-06-01 09:54 | rocket
          @arlen

          是這樣的,在使用xhr發出請求時,實際上是向后臺發送了一個http的包,只不過這個http的包是封裝的xmlhttprequest,而xmlhttprequest對中文的編碼方式是gb2312的,這樣由于頁面用的是utf-8編碼,所以在后臺就會出現問題了。
          所以如果你的頁面是gbK或者gb2312編碼的,這樣在用xmlhttprequest就沒有這么多麻煩了  回復  更多評論
            
          # re: ajax中文上傳編碼問題 2007-01-17 18:06 | nova
          謝謝你,幫了我一個大忙。  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 武冈市| 克拉玛依市| 韩城市| 苏尼特右旗| 固始县| 石嘴山市| 黎城县| 兴城市| 绥化市| 桂阳县| 永嘉县| 营口市| 牡丹江市| 澳门| 县级市| 新竹县| 仁怀市| 荆州市| 涿鹿县| 镇原县| 灌南县| 万山特区| 辉县市| 尼木县| 固阳县| 永福县| 积石山| 镇平县| 香港| 丹棱县| 土默特左旗| 云浮市| 贵阳市| 西安市| 渭南市| 阳春市| 济宁市| 黔江区| 聂拉木县| 道孚县| 辉县市|