UTF.COM.CN

ajax中传递中文参数的编码问题

作者:佚名 | 来源:网络 | 添加时间:2008-03-13 17:21:19 | 人气:406

ajax中传递中文参数的编码问题

遇到问题:在使用xhr发出请求时,请求的url中参数带中文,这时在后台解析request得不到中文
如:
request = new ActiveXObject("Microsoft.XMLHTTP");
request.open("GET", url);中我的url需要带中文参数
直接加参数是在后台解析不出来的,所以我使用方法对url进行编码转换

在页面中中文参数传递前先转码:


function enCode(chineseStr) {
        return escape(chineseStr,'utf-8');
}

用经过转马后的字符串去生成 url


然后就要在后台进行解码了
以为没法直接从request中取到编码字符串,所以使用方法先取出url,然后再取出url的参数进行解码
取出url,以及取参数方法

String XXX= getUrlParameter(unescape(request.getQueryString()),"XXX");

//如此获得的XXX即为解码后的正确的中文


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 就是正确的中文了
问题解决

在使用xhr发出请求时,实际上是向后台发送了一个http的包,只不过这个http的包是封装的xmlhttprequest,而xmlhttprequest对中文的编码方式是gb2312的,这样由于页面用的是utf-8编码,所以在后台就会出现问题了。
所以如果你的页面是gbK或者gb2312编码的,这样在用xmlhttprequest就没有这么多麻烦了

责任编辑:冬天来了
【字号: 】【去论坛讨论】【发表评论】【打印本文】【告诉好友】【关闭窗口
网友评论(评论内容只代表网友观点,与本站立场无关!)

姓名:

验证码: 点击刷新