var Base64 = {
_b64: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
- encodeString: function(data) {
- data = this._utf8_encode(data);
- var input = [];
- for (var i = 0; i < data.length; ++i) {
- input.push(data.charCodeAt(i));
- }
- return this.encode(input);
+ encodeString: function(str) {
+ return this.encode(this._utf8_encode(str));
},
encode: function(data) {
var output = '';
},
_utf8_encode: function(str) {
str = str.replace(/\r\n/g, '\n');
- var utftext = '';
-
- for (var n = 0; n < str.length; n++) {
+ var utfarray = [];
- var c = str.charCodeAt(n);
+ //TODO: use for( var c of str ) in future versions
+ for (var offset = 0; offset < str.length; offset++) {
+ var code = str.codePointAt(offset);
- if (c < 128) {
- utftext += String.fromCharCode(c);
+ if (code <= 0x7F) {
+ utfarray.push(code);
}
- else if ((c > 127) && (c < 2048)) {
- utftext += String.fromCharCode((c >> 6) | 192);
- utftext += String.fromCharCode((c & 63) | 128);
+ else if (code <= 0x7FF) {
+ utfarray.push( 0xC0 | (code >> 6), 0x80 | (code & 0x3F) );
+ }
+ else if (code <= 0xFFFF) {
+ utfarray.push( 0xE0 | (code >> 12), 0x80 | ((code >> 6) & 0x3F), 0x80 | (code & 0x3F) );
}
else {
- utftext += String.fromCharCode((c >> 12) | 224);
- utftext += String.fromCharCode(((c >> 6) & 63) | 128);
- utftext += String.fromCharCode((c & 63) | 128);
+ utfarray.push( 0xF0 | (code >> 18), 0x80 | ((code >> 12) & 0x3F),
+ 0x80 | ((code >> 6) & 0x3F), 0x80 | (code & 0x3F) );
+ offset++; //there is a UTF16 surrogate pair in str, so jump two elements
}
-
}
- return utftext;
+ return utfarray;
},
_utf8_decode: function(utfarray) {
var str = '';
str += String.fromCharCode(c);
i++;
}
- else if ((c > 191) && (c < 224)) {
+ else if ((c >= 192) && (c < 224)) {
c1 = utfarray[i + 1];
str += String.fromCharCode(((c & 31) << 6) | (c1 & 63));
i += 2;
}
- else if((c > 223) && (c < 240)) {
+ else if((c >= 224) && (c < 240)) {
c1 = utfarray[i + 1];
c2 = utfarray[i + 2];
str += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));