请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 新增登录提醒插件 - 用至我的站点 地图任务一定要做 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

MIUI手机主题设计大赛,奔驰大奖等你拿! 想加薪?!蓝色理想招聘提供你更多机会 悬赏答疑,赚取积分兑奖品!

查看: 3118|回复: 6

用javascript实现Base64编码(解决中文问题) [复制链接]

tane274 楼主
帖子
465
体力
1641
威望
0
居住地
湖南省 衡阳市
发表于 2006-6-18 11:18:00 |显示全部楼层
因javascript求出来的是Unicode要转换成Ansi后才能对它进行Base64编码
复制代码
西部数码云主机4G内存500G仅需423元
tane274 楼主
帖子
465
体力
1641
威望
0
居住地
湖南省 衡阳市
发表于 2006-6-18 11:19:00 |显示全部楼层
  1. <script src="UnicodeAnsi.js"></script>

  2. <script language = "JavaScript">
  3.    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  4.   //将Ansi编码的字符串进行Base64编码
  5.    function encode64(input) {
  6.       var output = "";
  7.       var chr1, chr2, chr3 = "";
  8.       var enc1, enc2, enc3, enc4 = "";
  9.       var i = 0;

  10.       do {
  11.                  chr1 = input.charCodeAt(i++);
  12.          chr2 = input.charCodeAt(i++);
  13.          chr3 = input.charCodeAt(i++);

  14.          enc1 = chr1 >> 2;
  15.          enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  16.          enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  17.          enc4 = chr3 & 63;

  18.          if (isNaN(chr2)) {
  19.             enc3 = enc4 = 64;
  20.          } else if (isNaN(chr3)) {
  21.             enc4 = 64;
  22.          }

  23.          output = output +
  24.             keyStr.charAt(enc1) +
  25.             keyStr.charAt(enc2) +
  26.             keyStr.charAt(enc3) +
  27.             keyStr.charAt(enc4);
  28.          chr1 = chr2 = chr3 = "";
  29.          enc1 = enc2 = enc3 = enc4 = "";
  30.       } while (i < input.length);

  31.       return output;
  32.    }

  33.   //将Base64编码字符串转换成Ansi编码的字符串
  34.    function decode64(input) {
  35.       var output = "";
  36.       var chr1, chr2, chr3 = "";
  37.       var enc1, enc2, enc3, enc4 = "";
  38.       var i = 0;
  39.          
  40.           if(input.length%4!=0)
  41.           {
  42.                     return "";
  43.           }
  44.       var base64test = /[^A-Za-z0-9\+\/\=]/g;
  45.           if (base64test.exec(input))
  46.           {
  47.                     return "";
  48.           }

  49.       do {
  50.          enc1 = keyStr.indexOf(input.charAt(i++));
  51.          enc2 = keyStr.indexOf(input.charAt(i++));
  52.          enc3 = keyStr.indexOf(input.charAt(i++));
  53.          enc4 = keyStr.indexOf(input.charAt(i++));

  54.          chr1 = (enc1 << 2) | (enc2 >> 4);
  55.          chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
  56.          chr3 = ((enc3 & 3) << 6) | enc4;
  57.                  
  58.                  output = output + String.fromCharCode(chr1);

  59.          if (enc3 != 64) {
  60.                         output+=String.fromCharCode(chr2);
  61.          }
  62.          if (enc4 != 64) {
  63.                         output+=String.fromCharCode(chr3);
  64.          }

  65.          chr1 = chr2 = chr3 = "";
  66.          enc1 = enc2 = enc3 = enc4 = "";

  67.       } while (i < input.length);

  68.       return output;
  69.    }
  70.    var de=encode64(strUnicode2Ansi("中国人"));
  71.    var en=strAnsi2Unicode(decode64(de));
  72.    document.writeln(de+"<br>");
  73.    document.writeln(en+"<br>");
复制代码
租服务器,上51IDC

使用道具 举报

bound0 

老饕

版主 手机认证 

帖子
6778
体力
9169
威望
287
发表于 2006-6-18 13:22:00 |显示全部楼层
不错。
下载一个Acrobat 7.0 Reader
安装以后,在安装目录下下有文件夹
Resource\CMap\
里面有很多编码互换的资源

使用道具 举报

andot 
帖子
273
体力
2267
威望
14
发表于 2006-6-18 23:16:00 |显示全部楼层
http://www.coolcode.cn/?p=106&pp=3

这里有更好的,不需要那么大的一个表。UTF16 到 UTF8 的转换是有公式的。

使用道具 举报

tane274 楼主
帖子
465
体力
1641
威望
0
居住地
湖南省 衡阳市
发表于 2006-6-19 09:47:00 |显示全部楼层
刚刚那个我看过了
他的base64encode和base64decode不能处理中文问题
既使用utf16to8和utf8to16转换也不能得到正确的中文的base64编码

更何况我这是把Unicode编码转成GB2312

使用我的这个函数对中文进行base64编码可用PHP的base64_decode解码

用PHP的base64_encode编码的可以用上面的decode64进行解码

使用道具 举报

200mb 
帖子
40
体力
286
威望
0
发表于 2006-6-19 10:46:00 |显示全部楼层
二进制数据的base64编码

<script>
var xml=document.createElement("xml");
var http=new ActiveXObject("Microsoft.XmlHttp");
http.open("GET",opener.location.href,false,"","");
http.send(null);xml.loadXML("<xmp/>");
xml.lastChild.dataType="bin.base64";
xml.lastChild.nodeTypedValue=http.responseBody;
document.write(xml.xml);
</script>


nodeTypedValue这个返回的就是base64的解码

<script>
var xml=document.createElement("xml");
xml.loadXML("<xmp/>");
xml.lastChild.dataType="bin.base64";
xml.lastChild.text="LU5OU7pOEWxxUYxU/VY=";
alert(xml.lastChild.nodeTypedValue);
</script>

使用道具 举报

andot 
帖子
273
体力
2267
威望
14
发表于 2006-6-19 13:45:00 |显示全部楼层
to tane274:
中文有不同的编码方式,我那个是对 utf8 编码的中文进行的 base64 编码,在 php 中可以直接用 base64_decode 解码,反之亦然。在 PHP 中你只要用 utf8 编码中文就可以了。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册


Archiver|手机版|blueidea.com ( 京ICP备05002321号 )    

GMT+8, 2012-5-25 14:34 , Processed in 0.147090 second(s), 7 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部