×
您的位置: 首页 > 编程笔记

怎么解决js解码base64中文乱码问题

中文乱码 base64 时间:2014-10-30  查看:2801   收藏
我是一名中国的软件工程师,如果你要问我中国软件工程师与外国的有什么区别,区别就是在于做为中国软件工程师很蛋疼,这里不怪天朝,我痛恨中文编码,更痛恨中文解码,为什么,UTF8页面的编码实际还是用UTF-16存储的。 
最近在做一个插件开发,我用c++在插件里面把带中文的字符串用base64算法加密后推给网页的js去解码,解出来的相信大家预料到了,洋文一字不差,中文就TMD的都是乱码。 
google了一下,也没找到能解决问题的方法,没办法只好自己研究了。后来发现问题原因了,编码过程肯定是没有问题的,看到前面加颜色那段字了没,就是我解出来的编码虽然是utf8,但是将中文文字进行Base64编码再解码后,重新排列编码的时候,往往就会出现乱码,UTF8页面的编码实际还是用UTF-16存储的。应该在解码后把UTF8还原为UTF-16格式。这样就能真正搞定javascript解密中文base64编码的问题了。 
这里我就把js解码代码贴出来,给广大同胞: 
  

/** 
* Waitang.com 
*/ 
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); 
//base64编码 
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; 

//base64解码 
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; 


这是转换utf8到utf16的代码:



/** 
* Yovae.com 
*/ 
//utf-8转utf16 
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; 

//utf-16转utf-8 
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; 


这是c++ base64编码代码:



/** 
* Yovae.com 
*/ 
CString encode(const CString in_str) 

const CString _base64_encode_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
CString out_str; 
unsigned char c1, c2, c3; 
int i = 0; 
int len = in_str.GetLength(); 
while ( i { 
c1 = in_str[i++]; 
if ( i==len ) 

out_str += _base64_encode_chars[ c1>>2 ]; 
out_str += _base64_encode_chars[ (c1&0x3)<<4 ]; 
out_str += "=="; 
break; 

c2 = in_str[i++]; 
if ( i==len ) 

out_str += _base64_encode_chars[ c1>>2 ]; 
out_str += _base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>>4) ]; 
out_str += _base64_encode_chars[ (c2&0xF)<<2 ]; 
out_str += "="; 
break; 


c3 = in_str[i++]; 
out_str += _base64_encode_chars[ c1>>2 ]; 
out_str += _base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>>4) ]; 
out_str += _base64_encode_chars[ ((c2&0xF)<<2) | ((c3&0xC0)>>6) ]; 
out_str += _base64_encode_chars[ c3&0x3F ]; 

return out_str; 


相信有了以上代码,js解码base64的时候再出现中文乱码就成为历史了。just do it!

 

0% (0)
0% (0)