ajax中文上传编码问题

ajax中文上传编码问题
上次提出了一个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 就是正确的中文了
问题解决

你可能感兴趣的:(ajax中文上传编码问题)