解决JS base64解码中文乱码问题
博客专区 > dzb3688 的博客 > 博客详情
解决JS base64解码中文乱码问题
dzb3688 发表于4年前
解决JS base64解码中文乱码问题
  • 发表于 4年前
  • 阅读 844
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个 “=”。

今天在使用Jsonp返回数据中有个对象数据太多,想用base64来传递

打印enbase64发现中文都是乱码

google后找到了解决办法,特将代码贴于此处,以供参考

 //下面是64个基本的编码
  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);
 //解码的方法
  function base64decode(str) {
     var c1, c2, c3, c4;
      var i, len, out;
     len = str.length;
     i = 0;
     out = "";
     while(i < len) {
    
    do {
         c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
     } while(i < len && c1 == -1);
     if(c1 == -1)
         break;
     
      do {
         c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
     } while(i < len && c2 == -1);
      if(c2 == -1)
         break;
      out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
      
      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));
     
     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 encode
  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;
  }

打印数据:

utf8to16(base64decode(json.consult))

参考地址: http://www.cnblogs.com/ricksun/archive/2012/08/27/2658654.html

共有 人打赏支持
粉丝 7
博文 40
码字总数 10255
×
dzb3688
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: