JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)


Posted in Javascript onJune 21, 2016

本文实例讲述了JS实现对中文字符串进行utf-8的Base64编码的方法。分享给大家供大家参考,具体如下:

要进行编码的字符串:“select 用户名 from 用户”

使用JAVA进行编码,Java程序:

String sql = "select 用户名 from 用户";
String encodeStr = new String(Base64.encode(sql.getBytes("UTF-8"))); // 编码
System.out.println(encodeStr);

得到:

c2VsZWN0IOeUqOaIt+WQjSBmcm9tIOeUqOaItw==

在Java中解码:

sql = new String(Base64.decode(sql.getBytes()), "UTF-8");

Java代码中为什么要使用getBytes("UTF-8")呢?因为Windows和Linux环境下默认编码不同,要使你的程序在不同平台下得到相同编码,必然要指定编码

虽然Html和JS的编码都是utf-8,但JS从页面上得到的中文编码却是utf-16,所以直接对中文进行Base64编码将得到错误的结果,所以我们要先从utf-16转到utf-8再编码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
<!--
body{
 margin:0px;
 padding:0px;
}
body,td{
 font-size:9pt;
}
-->
</style>
<script type="text/JavaScript">
<!--
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
//将Ansi编码的字符串进行Base64编码
function encode64(input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 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;
} else if (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);
return output;
}
//将Base64编码字符串转换成Ansi编码的字符串
function decode64(input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
if (input.length % 4 != 0) {
return "";
}
var base64test = /[^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);
return output;
}
function utf16to8(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;
}
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;
}
// 测试代码 开始
var de = encode64(utf16to8("select 用户名 from 用户"));
document.writeln(de+"<br>");
var ee = utf8to16(decode64(de))
document.writeln(ee);
// 测试代码 结束
//-->
</script>
</head>
<body>
</body>
</html>

上面的代码都是从网上得来,拼凑后得到正确结果,在此感谢前辈们

PS:这里再为大家推荐几款base64编码解码在线工具,相信在以后的开发中会用得到:

BASE64编码解码工具:
http://tools.3water.com/transcoding/base64

在线图片转换BASE64工具:
http://tools.3water.com/transcoding/img2base64

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 面向对象,实现namespace,class,继承,重载
Oct 29 Javascript
基于jQuery的一个扩展form序列化到json对象
Dec 09 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 Javascript
简单的代码实现jquery定时器
Nov 17 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
Apr 12 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
Apr 02 Javascript
ES6中如何使用Set和WeakSet
Mar 10 Javascript
jQuery页面加载初始化的3种方法(推荐)
Jun 02 Javascript
JavaScript设计模式之单例模式详解
Jun 09 Javascript
基于Require.js使用方法(总结)
Oct 26 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
Jul 19 Javascript
第十篇BootStrap轮播插件使用详解
Jun 21 #Javascript
JavaScript简单获取页面图片原始尺寸的方法
Jun 21 #Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 #Javascript
js简单判断flash是否加载完成的方法
Jun 21 #Javascript
第八篇Bootstrap下拉菜单实例代码
Jun 21 #Javascript
JS实现获取剪贴板内容的方法
Jun 21 #Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
Jun 21 #Javascript
You might like
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
js实现登录与注册界面
2017/11/01 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
python有证书的加密解密实现方法
2014/11/19 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
django在开发中取消外键约束的实现
2020/05/20 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
大学活动邀请函
2014/01/28 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
毕业设计工作总结
2015/08/14 职场文书
志愿者工作心得体会
2016/01/15 职场文书
详解Redis瘦身指南
2021/05/26 Redis
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers
python实现简单的三子棋游戏
2022/04/28 Python