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 模式实例 观察者模式
Oct 24 Javascript
巧用局部变量提升javascript性能
Feb 24 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
彻底学会Angular.js中的transclusion
Mar 12 Javascript
微信小程序 图片上传实例详解
May 05 Javascript
PostgreSQL Node.js实现函数计算方法示例
Feb 12 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
Jun 10 Javascript
vue-week-picker实现支持按周切换的日历
Jun 26 Javascript
vue.js 2.0实现简单分页效果
Jul 29 Javascript
微信小程序实现侧边分类栏
Oct 21 Javascript
详解Vue router路由
Nov 20 Vue.js
第十篇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
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
django中的ajax组件教程详解
2018/10/18 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
python验证身份证信息实例代码
2019/05/06 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
Django Rest framework权限的详细用法
2019/07/25 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
法国珠宝店:CLEOR
2017/01/29 全球购物
Auguste The Label官网:澳大利亚一家精品女装时尚品牌
2020/06/14 全球购物
行政求职信
2014/07/04 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
班级班风口号大全
2015/12/25 职场文书
篮球拉拉队口号
2015/12/25 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
javascript的setTimeout()使用方法总结
2021/11/20 Javascript
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL