隨筆-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 閱讀(1961) 評論(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
          謝謝你,幫了我一個大忙。  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 梁平县| 克山县| 江西省| 韩城市| 焉耆| 龙南县| 扎鲁特旗| 且末县| 德阳市| 博罗县| 普定县| 瑞丽市| 广南县| 石楼县| 沁源县| 平顺县| 昌都县| 孟州市| 于田县| 冕宁县| 唐河县| 宝坻区| 论坛| 阜康市| 桑植县| 勃利县| 民丰县| 夏津县| 河东区| 新安县| 福海县| 肥西县| 河池市| 同德县| 临海市| 大田县| 三门峡市| 罗江县| 安宁市| 白玉县| 新和县|