javascript 用base64解码后中文乱码的问题

网上查了好久,又结合自己的分析,终于查到了原因:UTF8页面的编码在存储时实际上还是用的UTF-16!

解决方法:解码后把utf8还原为utf16即可。

附上网上找的utf8与utf16互相转换的实现:

//utf-16转utf8

utf16to8 : function(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-8转utf-16

utf8to16 : function(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;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 01.{ 换行: Opening Brace Can't Be Placed on a Separate Lin...
    码农不器阅读 2,431评论 0 14
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,790评论 0 33
  • 王摩诘的《终南别业》诗, 正是一幅初冬清境—— 中岁颇好道 晚家南山陲 兴来每独往 胜事空自知 行到水穷处 坐看云...
    摩羯星一号阅读 389评论 9 8
  • 很小的时候就在想人为什么会死?死亡对于每个人的意义何在?既然我们好不容易来到这个世界,为什么还要经历这么多的生离死...
    无数阅读 320评论 0 0
  • 开心, 爸爸昨天进入拉萨了,整整14天。 应该还有一半的时间,爸爸才回家。 从一开始觉得不可能,到影响,到想像,到...
    蔡敏_Michelle阅读 165评论 0 1