jquery.base64.js的修正
http://my.oschina.net/aruan/blog/418980
深圳一朋友说使用jquery.base64.js时发现对于中文直接抛出异常,作者压根不处理汉字的情况,因此
深圳一朋友说使用jquery.base64.js时发现对于中文直接抛出异常,作者压根不处理汉字的情况,因此
对其进行修正,关键函数为:
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 26 27 28 29 30 31 32 33 34 35 |
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)); } } |
完整代码
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 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
Js代码 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 ) ); |