JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
本文实例讲述了JS实现对中文字符串进行utf-8的Base64编码的方法。分享给大家供大家参考,具体如下:
要进行编码的字符串:“select用户名from用户”
使用JAVA进行编码,Java程序:
Stringsql="select用户名from用户"; StringencodeStr=newString(Base64.encode(sql.getBytes("UTF-8")));//编码 System.out.println(encodeStr);
得到:
c2VsZWN0IOeUqOaIt+WQjSBmcm9tIOeUqOaItw==
在Java中解码:
sql=newString(Base64.decode(sql.getBytes()),"UTF-8");
Java代码中为什么要使用getBytes("UTF-8")呢?因为Windows和Linux环境下默认编码不同,要使你的程序在不同平台下得到相同编码,必然要指定编码
虽然Html和JS的编码都是utf-8,但JS从页面上得到的中文编码却是utf-16,所以直接对中文进行Base64编码将得到错误的结果,所以我们要先从utf-16转到utf-8再编码
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/> <styletype="text/css"> <!-- body{ margin:0px; padding:0px; } body,td{ font-size:9pt; } --> </style> <scripttype="text/JavaScript"> <!-- varkeyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; //将Ansi编码的字符串进行Base64编码 functionencode64(input){ varoutput=""; varchr1,chr2,chr3=""; varenc1,enc2,enc3,enc4=""; vari=0; do{ chr1=input.charCodeAt(i++); chr2=input.charCodeAt(i++); chr3=input.charCodeAt(i++); enc1=chr1>>2; enc2=((chr1&3)<<4)|(chr2>>4); enc3=((chr2&15)<<2)|(chr3>>6); enc4=chr3&63; if(isNaN(chr2)){ enc3=enc4=64; }elseif(isNaN(chr3)){ enc4=64; } output=output+keyStr.charAt(enc1)+keyStr.charAt(enc2) +keyStr.charAt(enc3)+keyStr.charAt(enc4); chr1=chr2=chr3=""; enc1=enc2=enc3=enc4=""; }while(i<input.length); returnoutput; } //将Base64编码字符串转换成Ansi编码的字符串 functiondecode64(input){ varoutput=""; varchr1,chr2,chr3=""; varenc1,enc2,enc3,enc4=""; vari=0; if(input.length%4!=0){ return""; } varbase64test=/[^A-Za-z0-9\+\/\=]/g; if(base64test.exec(input)){ return""; } do{ enc1=keyStr.indexOf(input.charAt(i++)); enc2=keyStr.indexOf(input.charAt(i++)); enc3=keyStr.indexOf(input.charAt(i++)); enc4=keyStr.indexOf(input.charAt(i++)); chr1=(enc1<<2)|(enc2>>4); chr2=((enc2&15)<<4)|(enc3>>2); chr3=((enc3&3)<<6)|enc4; output=output+String.fromCharCode(chr1); if(enc3!=64){ output+=String.fromCharCode(chr2); } if(enc4!=64){ output+=String.fromCharCode(chr3); } chr1=chr2=chr3=""; enc1=enc2=enc3=enc4=""; }while(i<input.length); returnoutput; } functionutf16to8(str){ varout,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); }elseif(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)); } } returnout; } functionutf8to16(str){ varout,i,len,c; varchar2,char3; out=""; len=str.length; i=0; while(i<len){ c=str.charCodeAt(i++); switch(c>>4){ case0:case1:case2:case3:case4:case5:case6:case7: //0xxxxxxx out+=str.charAt(i-1); break; case12:case13: //110xxxxx10xxxxxx char2=str.charCodeAt(i++); out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F)); break; case14: //1110xxxx10xxxxxx10xxxxxx char2=str.charCodeAt(i++); char3=str.charCodeAt(i++); out+=String.fromCharCode(((c&0x0F)<<12)| ((char2&0x3F)<<6)| ((char3&0x3F)<<0)); break; } } returnout; } //测试代码开始 varde=encode64(utf16to8("select用户名from用户")); document.writeln(de+"<br>"); varee=utf8to16(decode64(de)) document.writeln(ee); //测试代码结束 //--> </script> </head> <body> </body> </html>
上面的代码都是从网上得来,拼凑后得到正确结果,在此感谢前辈们
PS:这里再为大家推荐几款base64编码解码在线工具,相信在以后的开发中会用得到:
BASE64编码解码工具:
http://tools.jb51.net/transcoding/base64
在线图片转换BASE64工具:
http://tools.jb51.net/transcoding/img2base64
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。