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程序设计有所帮助。