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

          遇到問(wèn)題:在使用xhr發(fā)出請(qǐng)求時(shí),請(qǐng)求的url中參數(shù)帶中文,這時(shí)在后臺(tái)解析request得不到中文
          如:
          request = new ActiveXObject("Microsoft.XMLHTTP");
          request.open("GET", url);中我的url需要帶中文參數(shù)
          直接加參數(shù)是在后臺(tái)解析不出來(lái)的,所以我使用方法對(duì)url進(jìn)行編碼轉(zhuǎn)換
          request?=?new?ActiveXObject("Microsoft.XMLHTTP");
          request.open(
          "GET",?uriFunc());

          //省略了對(duì)象定義
          //
          ..


          function?uriFunc()?{
          ????
          var?separator?=?"?";
          ????
          if?(uri.indexOf("?")?>=?0)
          ????????separator?
          =?"&";????????
          ????
          return?uri?+?separator?+?paramName?+?"="?+?escape(inputField.value,'utf-8');
          ??}
          然后就要在后臺(tái)進(jìn)行解碼了
          以為沒(méi)法直接從request中取到編碼字符串,所以使用方法先取出url,然后再取出url的參數(shù)進(jìn)行解碼
          取出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];
          ??????}

          ?
          //解碼方法
          ?
          //以下是對(duì)js的escape進(jìn)行解碼
          ??????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?};

          ?????
          ??????
          /**
          ???????*?解碼?說(shuō)明:本方法保證?不論參數(shù)s是否經(jīng)過(guò)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'..'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?{?//?對(duì)應(yīng)的字符未經(jīng)過(guò)編碼
          ??????sbuf.append((char)?ch);
          ??????}
          ??????i
          ++;
          ??????}
          ??????
          return?sbuf.toString();
          ??????}

          這時(shí)候得到的exfirstword 就是正確的中文了
          問(wèn)題解決

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

          評(píng)論:
          # re: ajax中文上傳編碼問(wèn)題 2006-05-31 12:33 | arlen
          感謝. 可是為什么直接用中文就不可以呢??? 我得到得中文是gbk編碼的, 但是沒(méi)法轉(zhuǎn)成utf-8. 覺(jué)得跟很多因素有關(guān)系  回復(fù)  更多評(píng)論
            
          # re: ajax中文上傳編碼問(wèn)題 2006-06-01 09:54 | rocket
          @arlen

          是這樣的,在使用xhr發(fā)出請(qǐng)求時(shí),實(shí)際上是向后臺(tái)發(fā)送了一個(gè)http的包,只不過(guò)這個(gè)http的包是封裝的xmlhttprequest,而xmlhttprequest對(duì)中文的編碼方式是gb2312的,這樣由于頁(yè)面用的是utf-8編碼,所以在后臺(tái)就會(huì)出現(xiàn)問(wèn)題了。
          所以如果你的頁(yè)面是gbK或者gb2312編碼的,這樣在用xmlhttprequest就沒(méi)有這么多麻煩了  回復(fù)  更多評(píng)論
            
          # re: ajax中文上傳編碼問(wèn)題 2007-01-17 18:06 | nova
          謝謝你,幫了我一個(gè)大忙。  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 永丰县| 平武县| 文水县| 略阳县| 和林格尔县| 沙田区| 乌鲁木齐市| 苏尼特右旗| 辉南县| 清苑县| 洛隆县| 微山县| 象州县| 安溪县| 苍梧县| 荥阳市| 原平市| 黄陵县| 高阳县| 孙吴县| 名山县| 玛沁县| 密云县| 忻城县| 开平市| 丹寨县| 调兵山市| 漳浦县| 江城| 定襄县| 南皮县| 米泉市| 鄯善县| 元江| 文昌市| 富源县| 怀远县| 屏东县| 南岸区| 新晃| 汝阳县|