使用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>
时间: 2024-08-05 20:22:58

使用window.btoa和window.atob来进行Base64编码和解码的相关文章

window.btoa 和 window.atob

前一段时间被安全部门查出,明文传递密码,被要求整改. 然后就进行了引入了第三方的base64编码的js库,进行了编码然后传递. 其实在前端的加密都是寻求一个心理安慰,作用是微乎其微的,确实也更加好那么一点. 今天在看 filer 无意看到了 btoa和atob. 这不就是内置的base64编码和解码么,那么接下来有两个问题 兼容性和中文的支持情况 兼容性 兼容性IE10以上和其他浏览器都支持,还是相对不错的,要是移动端都支持. 借两张 MDN的图片,要是真遇到IE怎么办,引入polyfill库,

window.btoa

概述 将ascii字符串或二进制数据转换成一个base64编码过的字符串,该方法不能直接作用于Unicode字符串. 语法 var encodedData = window.btoa(stringToEncode); 例子 var encodedData = window.btoa("Hello, world"); // 编码 var decodedData = window.atob(encodedData); // 解码 备注 由于一些网络通讯协议的限制,你必须使用该方法对原数据进

javascript 使用btoa和atob来进行Base64转码和解码

老是记不住这两个函数,干脆写下来,比较好翻. avascript原生的api本来就支持,Base64,但是由于之前的javascript局限性,导致Base64基本中看不中用.当前html5标准正式化之际,Base64将有较大的转型空间,对于Html5 Api中出现的如FileReader Api, 拖拽上传,甚至是Canvas,Video截图都可以实现. 好了,前言说了一大堆,开发者需要重视: 一.我们来看看,在javascript中如何使用Base64转码 var str = 'javasc

javascript使用btoa和atob来进行Base64转码和解码

javascript中如何使用Base64转码 let str = 'javascript'; let btoaStr = window.btoa(str); //转码结果 amF2YXNjcmlwdA== console.log(btoaStr); console.log(window.atob(btoaStr)); //解码结果 javascript Base64转码的对象只能是字符串, var str = "China,中国"; window.btoa(str) ; // 报错

关于window.onload,window.onbeforeload与window.onunload

★  window.onload  当页面加载完毕的时候执行,即在当前页面进行其他操作之前执行.如,刚进入某个网页的弹窗提示. (  与window.onload相近的可以参考我写的另外一篇记录"比较body.onload(function()).$(document).ready(function())与$(windows).load(function)"  ) ★  window.onbeforeunload 与 window.onunload 的比较 window.onbefor

window.showModalDialog 与window.open传递参数的不同?

简单的说,就是一个在弹出窗口之后可以做其它的事,即window.open 另一个在弹出窗口之后不能做其它的事,只能是关闭了当前的窗口之后才能做其它的事,即window.showModalDialog 那么两者在使用上有什么不同呢?他们分别是如何和父窗口进行交互的呢? 先来看window.showModalDialog的例子: 我这里现在有一个父窗体parent.jsp,它里面有一个方法 function openChild(){                var temp = window.

js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)

一.浏览器同源策略 首先我们需要了解一下浏览器的同源策略,关于同源策略可以仔细看看知乎上的一个解释.传送门 总之:同协议,domain(或ip),同端口视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源.这种安全限制称为同源策略. ( 现代浏览器在安全性和可用性之间选择了一个平衡点.在遵循同源策略的基础上,选择性地为同源策略"开放了后门". 例如img script style等标签,都允许垮域引用资源.) 下表给出了相对 

window.open()与window.showModalDialog

弹出窗口两种方式:    1.window.showModalDialog:      var feature = "dialogWidth:615px;dialogHeight:505px;status:no;help:no;scroll:no;resizable:no;center:yes";      window.showModalDialog(url, Object(传给弹出窗口的参数,可以是任何类型),feature)       决定窗口的外观是第三个参数feature,

window.parent与window.opener的区别与使用

window.parent 是iframe页面调用父页面对象 举例: a.html 如果我们需要在b.html中要对a.html中的username文本框赋值(就如很多上传功能,上传功能页在ifrmae中,上传成功后把上传后的路径放入父页面的文本框中), 我们应该在b.html中写: var _parentWin = window.parent;_parentWin.form1.username.value = "xxxx"; window.opener 是 window.open 打