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 相关文章推荐
ExtJS DOM元素操作经验分享
Aug 28 Javascript
jquery的父子兄弟节点查找示例代码
Mar 03 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
jQuery中text() val()和html()的区别实例详解
Jun 28 Javascript
JavaScript面向对象编写购物车功能
Aug 19 Javascript
js简单获取表单中单选按钮值的方法
Aug 23 Javascript
Bootstrap Table使用方法解析
Oct 19 Javascript
手把手教你搭建ES6的开发运行环境
Jul 11 Javascript
利用npm 安装删除模块的方法
May 15 Javascript
详解Angular6.0使用路由步骤(共7步)
Jun 29 Javascript
Element Tooltip 文字提示的使用示例
Jul 26 Javascript
Vue filter 过滤器、以及在table中的使用介绍
Sep 07 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
php访问查询mysql数据的三种方法
2006/10/09 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
php中namespace及use用法分析
2016/12/06 PHP
php无限极分类实现方法分析
2019/07/04 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
Python操作串口的方法
2015/06/17 Python
python中函数默认值使用注意点详解
2016/06/01 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
简单了解python变量的作用域
2019/07/30 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
Python如何读写字节数据
2020/08/05 Python
岗位廉洁从业承诺书
2014/03/28 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python