`

jquery.base64.js的修正

 
阅读更多
http://my.oschina.net/aruan/blog/418980
深圳一朋友说使用jquery.base64.js时发现对于中文直接抛出异常,作者压根不处理汉字的情况,因此

对其进行修正,关键函数为
function _decode_chars(y, x){
      while(y.length > 0){
        var ch = y[0];
        if(ch < 0x80) {
            y.shift();
            x.push(String.fromCharCode(ch));
        }else if((ch & 0x80) == 0xc0){
            if(y.length < 2) break;
            ch = y.shift();
            var ch1 = y.shift();
            x.push(String.fromCharCode( ((ch & 0x1f) << 6) + (ch1 & 0x3f)));
        }else{
            if(y.length < 3) break;
            ch = y.shift();
            var ch1 = y.shift();
            var ch2 = y.shift();
            x.push(String.fromCharCode(((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f)));
        }    
      }
  }



function _get_chars(ch, y){
    if(ch < 0x80) y.push(ch);
    else if(ch < 0x800){
        y.push(0xc0 + ((ch >> 6) & 0x1f));
        y.push(0x80 + (ch & 0x3f));
    }else{
        y.push(0xe0 + ((ch >> 12) & 0xf));
        y.push(0x80 + ((ch >> 6) & 0x3f));
        y.push(0x80 + (ch & 0x3f));
    }
  }






完整代码
jQuery.base64 = ( function( $ ) {
   
  var _PADCHAR = "=",
    _ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    _VERSION = "1.1";//Mr. Ruan fix to 1.1 to support asian char(utf8)
 
 
  function _getbyte64( s, i ) {
    // This is oddly fast, except on Chrome/V8.
    // Minimal or no improvement in performance by using a
    // object with properties mapping chars to value (eg. 'A': 0)
 
    var idx = _ALPHA.indexOf( s.charAt( i ) );
 
    if ( idx === -1 ) {
      throw "Cannot decode base64";
    }
 
    return idx;
  }
   
  function _decode_chars(y, x){
      while(y.length > 0){
        var ch = y[0];
        if(ch < 0x80) {
            y.shift();
            x.push(String.fromCharCode(ch));
        }else if((ch & 0x80) == 0xc0){
            if(y.length < 2) break;
            ch = y.shift();
            var ch1 = y.shift();
            x.push(String.fromCharCode( ((ch & 0x1f) << 6) + (ch1 & 0x3f)));
        }else{
            if(y.length < 3) break;
            ch = y.shift();
            var ch1 = y.shift();
            var ch2 = y.shift();
            x.push(String.fromCharCode(((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f)));
        }    
      }
  }
   
  function _decode( s ) {
    var pads = 0,
      i,
      b10,
      imax = s.length,
      x = [],
      y = [];
 
    s = String( s );
     
    if ( imax === 0 ) {
      return s;
    }
 
    if ( imax % 4 !== 0 ) {
      throw "Cannot decode base64";
    }
 
    if ( s.charAt( imax - 1 ) === _PADCHAR ) {
      pads = 1;
 
      if ( s.charAt( imax - 2 ) === _PADCHAR ) {
        pads = 2;
      }
 
      // either way, we want to ignore this last block
      imax -= 4;
    }
 
    for ( i = 0; i < imax; i += 4 ) {
      var ch1 = _getbyte64( s, i );
      var ch2 = _getbyte64( s, i + 1);
      var ch3 = _getbyte64( s, i + 2);
      var ch4 = _getbyte64( s, i + 3);
       
      b10 = ( _getbyte64( s, i ) << 18 ) | ( _getbyte64( s, i + 1 ) << 12 ) | ( _getbyte64( s, i + 2 ) << 6 ) | _getbyte64( s, i + 3 );
      y.push(b10 >> 16);
      y.push((b10 >> 8) & 0xff);
      y.push(b10 & 0xff);
      _decode_chars(y, x);
    }
    switch ( pads ) {
      case 1:
        b10 = ( _getbyte64( s, i ) << 18 ) | ( _getbyte64( s, i + 1 ) << 12 ) | ( _getbyte64( s, i + 2 ) << 6 );
        y.push(b10 >> 16);
        y.push((b10 >> 8) & 0xff);
        break;
 
      case 2:
        b10 = ( _getbyte64( s, i ) << 18) | ( _getbyte64( s, i + 1 ) << 12 );
        y.push(b10 >> 16);
        break;
    }
    _decode_chars(y, x);
    if(y.length > 0) throw "Cannot decode base64";
    return x.join( "" );
  }
   
   
  function _get_chars(ch, y){
    if(ch < 0x80) y.push(ch);
    else if(ch < 0x800){
        y.push(0xc0 + ((ch >> 6) & 0x1f));
        y.push(0x80 + (ch & 0x3f));
    }else{
        y.push(0xe0 + ((ch >> 12) & 0xf));
        y.push(0x80 + ((ch >> 6) & 0x3f));
        y.push(0x80 + (ch & 0x3f));
    }
  }
   
   
   
  function _encode( s ) {
    if ( arguments.length !== 1 ) {
      throw "SyntaxError: exactly one argument required";
    }
 
    s = String( s );
    if ( s.length === 0 ) {
      return s;
    }
     
    //s = _encode_utf8(s);
    var i,
      b10,
      y = [],
      x = [],
      len = s.length;
    i = 0;
    while(i < len){
        _get_chars(s.charCodeAt(i), y);
        while(y.length >= 3){
            var ch1 = y.shift();
            var ch2 = y.shift();
            var ch3 = y.shift();
            b10 = ( ch1 << 16 ) | ( ch2 << 8 ) | ch3;
            x.push( _ALPHA.charAt( b10 >> 18 ) );
            x.push( _ALPHA.charAt( ( b10 >> 12 ) & 0x3F ) );
            x.push( _ALPHA.charAt( ( b10 >> 6 ) & 0x3f ) );
            x.push( _ALPHA.charAt( b10 & 0x3f ) );
        }
        i++;
    }
      
 
    switch ( y.length ) {
      case 1:
        var ch = y.shift();
        b10 = ch << 16;
        x.push( _ALPHA.charAt( b10 >> 18 ) + _ALPHA.charAt( ( b10 >> 12 ) & 0x3F ) + _PADCHAR + _PADCHAR );
        break;
 
      case 2:
        var ch1 = y.shift();
        var ch2 = y.shift();
        b10 = ( ch1 << 16 ) | ( ch2 << 8 );
        x.push( _ALPHA.charAt( b10 >> 18 ) + _ALPHA.charAt( ( b10 >> 12 ) & 0x3F ) + _ALPHA.charAt( ( b10 >> 6 ) & 0x3f ) + _PADCHAR );
        break;
    }
 
    return x.join( "" );
  }
 
 
  return {
    decode: _decode,
    encode: _encode,
    VERSION: _VERSION
  };
       
}( jQuery ) );
分享到:
评论

相关推荐

    jquery.base64.js_downcc.zip

    jQuery作为一款强大的JavaScript库,提供了方便的工具函数来处理Base64编码与解码,这在`jquery.base64.js`这个文件中得到了体现。 首先,`jquery.base64.js`是一个扩展jQuery功能的插件,它添加了对Base64编码和...

    jquery.base64.js jquery-1.12.4.min.js

    `jquery.base64.js` 提供了方便的API,使得开发者能轻松地在JavaScript中进行Base64的处理,特别对于中文字符,该插件可以确保编码和解码过程中的正确性,避免出现乱码问题。 这两个文件在实际开发中的结合使用,...

    jquery.base64.js及使用方法

    "jquery.base64.js"是一个JavaScript库,它为jQuery提供了一种方便的方式来实现Base64编码和解码,从而帮助开发者在URL中安全地传递这些数据。在本文中,我们将深入探讨Base64编码的概念,以及如何使用jQuery与这个...

    jquery.base64.js

    jquery.base64.js

    Jquery.base64.js

    `jQuery.base64.js`这个JavaScript库,便是专为简化Base64编码和解码操作而设计的,特别是针对文件进行操作时。 `jQuery.base64.js`的核心功能在于提供了一个便捷的API,即`$.base64`,它允许开发者轻松地在Base64...

    jquery.base64.js下载

    本想免费分享,方便懒人同学的,居然必须2积分才能上传,也是醉了. 官网下载地址:http://plugins.jquery.com/base64/ 有完整实例. 资源上传时为最新版本. 再说一遍, 不想花费积分的可以去官网下载, 上边有地址 yo !

    jquery.base64

    在压缩包中的文件`yckart-jquery.base64.js-3b41286`应该是该jQuery Base64库的一个特定版本,其中包含了库的源代码。开发者可以通过将这个文件引入到HTML页面中,利用jQuery Base64库进行Base64的编码和解码操作。 ...

    jquery.base64.js编码与解码插件

    jquery.base64.js编码与解码插件jquery 一个很强大的插件很强大的,具体使用见我博文http://blog.csdn.net/jokewang5199/article/details/16965857

    jquery.base64.js.7z

    总之,`jquery.base64.js`为JavaScript开发者提供了便利的Base64编码和解码工具,特别适合处理中文内容。在实际项目中,根据具体需求灵活运用,可以提高代码效率,优化用户体验。在阅读和使用`yckart-jquery.base64....

    jquery-base64加密解密,支持中文

    可能包括HTML文件用于展示前端界面,JavaScript文件包含`jQuery`的Base64加密逻辑,以及Java的Servlet代码用于后台解密。这些文件的详细分析将有助于深入理解如何在实际项目中应用这种加密解密机制。 总结来说,这...

    jquery.hash.min.js 和 jquery.ba-hashchange.min.js

    在网页开发中,jQuery 是一个广泛使用的 JavaScript 库,它极大地简化了 DOM 操作、事件处理和动画制作等任务。而 `jquery.hash.min.js` 和 `jquery.ba-hashchange.min.js` 这两个文件则是在 jQuery 基础上扩展了对...

    jquery.tools.min.js 最新的1.2.7版本

    jquery.tools.min.js 最新的1.2.7版本 jquery.min.js是压缩版的jquery库,是由完整版的jQuery库经过压缩得来,压缩后功能与未压缩的完全一样,只是将其中的空白字符、注释、空行等与逻辑无关的内容删除,并进行一些...

    jquery.zTree.js.rar

    jquery-1.4.4.min.js jquery.ztree.exhide.min.js jquery.ztree.exedit.min.js jquery.ztree.excheck.min.js jquery.ztree.core.min.js jquery.ztree.all.min.js jquery-1.4.4.js jquery.ztree.exhide.js jquery....

    jquery.slimscroll.min.js

    jquery.slimscroll.min.js下载 jquery.slimscroll.min.js下载

Global site tag (gtag.js) - Google Analytics