使用window.btoa和window.atob来进行Base64编码和解码
方法描述
WindowBase64.atob() 函数用来解码一个已经被base-64编码过的数据。
WindowBase64.btoa() 函数 将ascii字符串或二进制数据转换成一个base64编码过的ASCII字符串,该方法不能直接作用于Unicode字符串.
window.atob: a ==> b
window.btoa: b ==> a
你可以使用 window.btoa() 方法来编码一个可能在传输过程中出现问题的数据,并且在接受数据之后,使用 window.atob() 方法来将数据解码。
var encodedData = window.btoa(stringToEncode);
var decodedData = window.atob(encodedData);
例子:
var encodedData = window.btoa("Hello, world"); //编码
console.log(encodedData);//SGVsbG8sIHdvcmxk
var decodedData = window.atob(encodedData); //解码
console.log(decodedData);//Hello, world
备注:
由于一些网络通讯协议的限制,你必须使用该方法对原数据进行编码后,才能进行发送.接收方使用相当于 window.atob 的方法对接受到的base64数据进行解码,得到原数据.
例如, 发送某些含有ASCII码表中0到31之间的控制字符的数据.
Unicode问题
由于 DOMString 是16位编码的字符串,所以如果有字符超出了8位ASCII编码的字符范围时,在大多数的浏览器中对Unicode字符串调用 window.btoa 将会造成一个 Character Out Of Range 的异常。
有2种方法解决这个问题:
第一个是转义整个字符串然后编码这个它;
第二个是把UTF-16的 DOMString 转码为UTF-8的字符数组然后编码它。 [我没测试过]
下面是2个可行的方法。
方法一: 编码之前转义字符串
function b64EncodeUnicode(str) {
return window.btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
b64EncodeUnicode('✓ à la mode');// "4pyTIMOgIGxhIG1vZGU="
方法二: 用JavaScript的TypedArray和UTF-8重写DOM的atob()和btoa()
使用像TextEncoding(包含了早期(legacy)的windows,mac, 和 ISO 编码),
TextEncoderLite 或者 Buffer 这样的文本编码器增强(polyfill)和Base64增强,
比如base64-js。
最简单, 最轻量级的解决方法就是使用 TextEncoderLite 和 base64-js.
测试案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>window.atob() && window.btoa()</title>
</head>
<body>
<input type="text" id="iptText" name="" />
<input type="button" id="iptBtoa" value="btoa编码" onclick="btoaFun()" />
<input type="button" id="iptAtob" value="atob解码" onclick="atobFun()" />
<div>
<label id="lblInfo1" style="color: red"></label>
<br/>
<label id="lblInfo2" style="color: blue"></label>
</div>
<script type="text/javascript"> /* window.atob() 解码*/
function atobFun() {
let strText = document.getElementById('lblInfo1').innerHTML;
let strText2 = document.getElementById('lblInfo2').innerHTML;
console.log(strText + "解码");
let strLen = strText.trim();
if (strLen.length > 0) {
let encodedStr = window.atob(strText);
document.getElementById('lblInfo1').innerHTML = encodedStr; let encodedStr2 = b64_to_utf8(strText2);
document.getElementById('lblInfo2').innerHTML = encodedStr2; console.log(encodedStr + "解码");
console.log(encodedStr2 + "解码");
} else {
alert('请输入字符串');
}
}
/* window.btoa() 编码*/
function btoaFun() {
let strText = document.getElementById('iptText').value;
let strLen = strText.trim();
if (strLen.length == 0) {
alert('请输入字符串');
} else {
let decodedStr = window.btoa(strText);
document.getElementById('lblInfo1').innerHTML = decodedStr; let decodedStr2 = utf8_to_b64(strText);
document.getElementById('lblInfo2').innerHTML = decodedStr2; console.log(decodedStr + "编码");
console.log(decodedStr2 + "编码"); }
} function utf8_to_b64(str) {
//encodeURIComponent()会对它发现的任何非标准字符进行编码。
// unescape && escape 慢慢被废弃,不建议使用。
// return window.btoa(unescape(encodeURIComponent(str)));
// return window.btoa(encodeURIComponent(str)); return window.btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
function (match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
function b64_to_utf8(str) {
//decodeURIComponent() 解析所有的非标准字符
// unescape && escape 慢慢被废弃,不建议使用。
// return decodeURIComponent(escape(window.atob(str)));
return decodeURIComponent(window.atob(str));
} </script>
</body>
</html>
完整案例
使用window.btoa和window.atob来进行Base64编码和解码的更多相关文章
- JS实现Base64编码、解码,即window.atob,window.btoa功能
window.atob(),window.btoa()方法可以对字符串精选base64编码和解码,但是有些环境比如nuxt的服务端环境没法使用window,所以需要自己实现一个base64的编码解码功 ...
- window.btoa 和 window.atob
前一段时间被安全部门查出,明文传递密码,被要求整改. 然后就进行了引入了第三方的base64编码的js库,进行了编码然后传递. 其实在前端的加密都是寻求一个心理安慰,作用是微乎其微的,确实也更加好那么 ...
- window.atob()与window.btoa()方法实现编码与解码
window.atob() 与window.btoa() WindowBase64.atob() 函数用来解码一个已经被base-64编码过的数据.你可以使用 window.btoa() 方法来编码一 ...
- 利用window对象自带atob和btoa方法进行base64的编码和解码
项目中一般需要将表单中的数据进行编码之后再进行传输到服务器,这个时候就需要base64编码 现在可以使用window自带的方法window.atob() 和 window.btoa() 方法进行 ...
- window.btoa
概述 将ascii字符串或二进制数据转换成一个base64编码过的字符串,该方法不能直接作用于Unicode字符串. 语法 var encodedData = window.btoa(stringTo ...
- js如何判断字符串是否进行过window.btoa()转码
window.btoa()是基于Base64算法的.window.btoa()只能将ASCII字符进行转码 因此我们需要了解Base64的原理及主要特征:Base64的原理在这里就不多说了,网上很多讲 ...
- window.btoa()方法;使字符编码成base64的形式
atob() 函数能够 解码 通过base-64编码的字符串数据.相反地, btoa() 函数能够从二进制数据“字符串” 创建 一个base-64编码的ASCII字符串.
- javascript 使用btoa和atob来进行Base64转码和解码
javascript原生的api本来就支持,Base64,但是由于之前的javascript局限性,导致Base64基本中看不中用.当前html5标准正式化之际,Base64将有较大的转型空间,对于H ...
- 使用btoa和atob来进行Base64转码和解码
btoa: 将普通字符串转为Base64字符串 atob: 将Base64字符串转为普通字符串 说明:window.btoa不支持汉字: ===>使用window.encodeURI ...
随机推荐
- Android之万能播放器解码框架Vitamio的介绍及使用
一.简介 Vitamio能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在Android 与 iOS 上跨平台支持 MMS, RTSP, R ...
- 【HAL库每天一例】freemodbus移植
例程下载:资料包括程序.相关说明资料以及软件使用截图 百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1 360云盘:https://yunpan.cn/OcP ...
- MAC下Xcode配置opencv(2017.3.29最新实践,亲测可行)
本文原创,未经同意,谢绝转载!(转载请告知本人并且经过本人同意--By Pacific-hong) 本人小硕一枚,因为专业方向图像相关,所以用到opencv,然后网上MAC下Xcode配置opencv ...
- Unity SteamVR插件集成
重要组件 SteamVR_Camera VR摄像机,主要功能是将Unity摄像机的画面进行变化,形成Vive中的成像画面 使用方法: l 在任一个摄像机上增加脚本 l 点击Expand按钮 完成以上操 ...
- 山谈c中printf格式修饰符
废话不多说,简单粗暴地上图. (一)初始定义 (二)运行结果 (三)规律总结 对于如下: printf("%7.4d",12); printf("%4.7f", ...
- Plupload上传插件简单整理
Plupload Plupload是有TinyMCE的开发者开发的,为您的内容管理系统或是类似上传程序提供一个高度可用的上传插件.Plupload 目前分为一个核心API 和一个jQuery上传队列部 ...
- IOS开发创建开发证书及发布App应用(八)——使用Application Loader工具上传应用
8.使用Application Loader工具上传应用 继续第七步在iTunes所创建的应用,打开应用,如下图 点击详情按钮进去之后,单击右上角Ready to Upload Binary按钮,如下 ...
- UNIX基础上
时光飞逝,转眼已经毕业快2年了,觉得自己学的东西多却不精.对此深深的思考一下,觉得有必要连载unix环境编程文章,以此激励自己学习.在此立贴为证,2天一篇博客从零开始阐述unix的环境编程. 参考书籍 ...
- windows下搭建tensorflow的环境
这年头,不会点人工智能和神经网络,都不好意思跟人打招呼了.之前搞了一下sklearn,今天觉得应该要了解一下google这个传说中的人工智能开源神器. 最近终于有时间了,凡事从hello world开 ...
- dotnet Core 调用HTTP接口,系统大量CLOSE_WAIT连接问题的分析,尚未解决。
环境: dotnet core 1.0.1 CentOS 7.2 今天在服务器巡检的时候,发现一个服务大量抛出异常 异常信息为: LockStatusPushError&&Messag ...