分享

JavaScript Base64 实现 通过 URL 传递 base64 编码 中文参数的问题_和浏览器判断

 CevenCheng 2011-06-08

通过 URL 传递 base64 编码 中文参数的问题_和浏览器判断

Tag:HTML

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://duyongguang./logs/52765707.html

一般情况下,URL 中的参数应使用 url 编码规则,即把参数字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。但是对于带有中文的参数来说,这种编码会使编码后的字符 串变得很长。如果希望有短一点的方式对参数编码,可以采用 base64 编码方式对字符串进行编码,但是 base64 编码方式不能处理 # 中的中文,因为 # 中的中文都是以 UTF-16 方式保存的。而 base64 只能处理单字节字符,所以不能直接用 base64 对带有中文的 # 字符串进行编码。但是可以通过 utf.js 这个程序中提供的 utf16to8 来将 UTF-16 编码的中文先转化为 UTF-8 方式,然后再进行 base64 编码。这样编码后的字符串,在传递到服务器端后可以直接通过 base64_decode 解码成 UTF-8 的中文字符串。但是还有个问题需要注意。base64 编码中使用了加号(+),而 + 在 URL 传递时会被当成空格,因此必须要将 base64 编码后的字符串中的加号替换成 %2B 才能当作 URL 参数进行传递。否则在服务器端解码后就会出错。

 

《script》

var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
var base64DecodeChars = new Array( 
          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 
          52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, 
          -1,    0,    1,    2,    3,    4,    5,    6,    7,    8,    9, 10, 11, 12, 13, 14, 
          15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, 
          -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 
          41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 
      );

//编码函数 
function base64encode(str) { 
      var out, i, len; 
      var c1, c2, c3; 
      len = str.length; 
      i = 0; 
      out = ""; 
      while(i < len) { 
          c1 = str.charCodeAt(i++) & 0xff; 
          if(i == len) { 
              out += base64EncodeChars.charAt(c1 >> 2); 
              out += base64EncodeChars.charAt((c1 & 0x3) << 4); 
              out += "=="; 
              break; 
          } 
          c2 = str.charCodeAt(i++); 
          if(i == len) { 
              out += base64EncodeChars.charAt(c1 >> 2); 
              out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
              out += base64EncodeChars.charAt((c2 & 0xF) << 2); 
              out += "="; 
              break; 
          } 
          c3 = str.charCodeAt(i++); 
          out += base64EncodeChars.charAt(c1 >> 2); 
          out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
          out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); 
          out += base64EncodeChars.charAt(c3 & 0x3F); 
      } 
      return out; 
}

//解码函数 
function base64decode(str) { 
      var c1, c2, c3, c4; 
      var i, len, out; 
      len = str.length; 
      i = 0; 
      out = ""; 
      while(i < len) { 
          /* c1 */ 
          do { 
              c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; 
          } while(i < len && c1 == -1); 
         
          if(c1 == -1) 
              break; 
          /* c2 */ 
          do { 
              c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; 
          } while(i < len && c2 == -1); 
         
          if(c2 == -1) 
              break; 
          out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); 
          /* c3 */ 
          do { 
              c3 = str.charCodeAt(i++) & 0xff; 
              if(c3 == 61) 
                  return out; 
              c3 = base64DecodeChars[c3]; 
          } while(i < len && c3 == -1); 
         
          if(c3 == -1) 
              break; 
          out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2)); 
          /* c4 */ 
          do { 
              c4 = str.charCodeAt(i++) & 0xff; 
              if(c4 == 61) 
                  return out; 
              c4 = base64DecodeChars[c4]; 
          } while(i < len && c4 == -1); 
         
          if(c4 == -1) 
              break; 
          out += String.fromCharCode(((c3 & 0x03) << 6) | c4); 
      } 
      return out; 
}

function utf16to8(str) { 
    var out, i, len, c;

    out = ""; 
    len = str.length; 
    for(i = 0; i < len; i++) { 
 c = str.charCodeAt(i); 
 if ((c >= 0x0001) && (c <= 0x007F)) { 
     out += str.charAt(i); 
 } else if (c > 0x07FF) { 
     out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); 
     out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F)); 
     out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F)); 
 } else { 
     out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F)); 
     out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F)); 
 } 
    } 
    return out; 
}

function utf8to16(str) { 
    var out, i, len, c; 
    var char2, char3;

    out = ""; 
    len = str.length; 
    i = 0; 
    while(i < len) { 
 c = str.charCodeAt(i++); 
 switch(c >> 4) 
 { 
   case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: 
     // 0xxxxxxx 
     out += str.charAt(i-1); 
     break; 
   case 12: case 13: 
     // 110x xxxx   10xx xxxx 
     char2 = str.charCodeAt(i++); 
     out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); 
     break; 
   case 14: 
     // 1110 xxxx  10xx xxxx  10xx xxxx 
     char2 = str.charCodeAt(i++); 
     char3 = str.charCodeAt(i++); 
     out += String.fromCharCode(((c & 0x0F) << 12) | 
        ((char2 & 0x3F) << 6) | 
        ((char3 & 0x3F) << 0)); 
     break; 
 } 
    }

    return out; 

function CheckBrowser(){ 
    var cb = "Unknown"; 
    if(window.ActiveXObject){ 
        cb = "IE"; 
    }else if(navigator.userAgent.toLowerCase().indexOf("firefox") != -1){ 
        cb = "Firefox"; 
    }else if((typeof document.implementation != "undefined") && (typeof document.implementation.createDocument != "undefined") && (typeof HTMLDocument != "undefined")){ 
        cb = "Mozilla"; 
    }else if(navigator.userAgent.toLowerCase().indexOf("opera") != -1){ 
        cb = "Opera"; 
    } 
    return cb; 
}

 

《/script》

 

例子:

 if(CheckBrowser()=="Firefox"){ 
  kindex += "&cpr_role_name="+cpr_role_name; 
  kindex += "&cpr_client_name="+cpr_client_name; 
  kindex += "&cpr_organization_name="+cpr_organization_name; 
  kindex += "&cpr_weaehouse_name="+cpr_weaehouse_name; 
 }else{ 
  kindex += "&cpr_role_name="+(encode64(utf16to8(cpr_role_name)).replace("+","%2B")); 
  kindex += "&cpr_client_name="+(encode64(utf16to8(cpr_client_name)).replace("+","%2B")); 
  kindex += "&cpr_organization_name="+(encode64(utf16to8(cpr_organization_name)).replace("+","%2B")); 
  kindex += "&cpr_weaehouse_name="+(encode64(utf16to8(cpr_weaehouse_name)).replace("+","%2B")); 
 }

PHP:

   if(stripos($_SERVER["HTTP_USER_AGENT"],"Firefox")){ 
    die(stripos($_SERVER["HTTP_USER_AGENT"],"Firefox")); 
 $cpr_role_name = $_GET['cpr_role_name']; 
 $cpr_client_name = $_GET['cpr_client_name']; 
 $cpr_organization_name = $_GET['cpr_organization_name']; 
 $cpr_weaehouse_name = $_GET['cpr_weaehouse_name']; 
  }else{ 
  $cpr_role_name = base64_decode($_GET['cpr_role_name']); 
  $cpr_client_name = base64_decode($_GET['cpr_client_name']); 
  $cpr_organization_name = base64_decode($_GET['cpr_organization_name']); 
  $cpr_weaehouse_name = base64_decode($_GET['cpr_weaehouse_name']); 
  }

例2:

<script type="text/#" src="http://shop./Tpl/default/Public/js/prototype.js"></script>
<script>
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
function base64encode(str) {
      var out, i, len;
      var c1, c2, c3;
      len = str.length;
      i = 0;
      out = "";
      while(i < len) {
          c1 = str.charCodeAt(i++) & 0xff;
          if(i == len) {
              out += base64EncodeChars.charAt(c1 >> 2);
              out += base64EncodeChars.charAt((c1 & 0x3) << 4);
              out += "==";
              break;
          }
          c2 = str.charCodeAt(i++);
          if(i == len) {
              out += base64EncodeChars.charAt(c1 >> 2);
              out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
              out += base64EncodeChars.charAt((c2 & 0xF) << 2);
              out += "=";
              break;
          }
          c3 = str.charCodeAt(i++);
          out += base64EncodeChars.charAt(c1 >> 2);
          out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
          out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
          out += base64EncodeChars.charAt(c3 & 0x3F);
      }
      return out;
}

function utf16to8(str) {
    var out, i, len, c;

    out = "";
    len = str.length;
    for(i = 0; i < len; i++) {
 c = str.charCodeAt(i);
 if ((c >= 0x0001) && (c <= 0x007F)) {
     out += str.charAt(i);
 } else if (c > 0x07FF) {
     out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
     out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
     out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
 } else {
     out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
     out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
 }
    }
    return out;
}
function CheckBrowser(){
    var cb = "Unknown";
    if(window.ActiveXObject){
        cb = "IE";
    }else if(navigator.userAgent.toLowerCase().indexOf("firefox") != -1){
        cb = "Firefox";
    }else if((typeof document.implementation != "undefined") && (typeof document.implementation.createDocument != "undefined") && (typeof HTMLDocument != "undefined")){
        cb = "Mozilla";
    }else if(navigator.userAgent.toLowerCase().indexOf("opera") != -1){
        cb = "Opera";
    }
    return cb;
}

function trans#(value){
     if(CheckBrowser()=="Firefox"){ 
       
  }else{ 
   value=base64encode(utf16to8(value)).replace("+","%2B");  
  } 
  window.location="__APP__/Index/search/smalltype/"+value+"/";
}
</script>

PHP

 function search(){ 
  
  if(stripos($_SERVER["HTTP_USER_AGENT"],"Firefox")){


       $value= $_GET[value];


    }else{

        $value= base64_decode($_GET[value]);    

     }

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多