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就没有这么多麻烦了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值