如何解决无法在“窗口”上执行“ btoa”:要编码的字符串包含Latin1范围之外的字符?
如果您有UTF8,请使用它(实际上与SVG源一起使用),例如:
btoa(unescape(encodeURIComponent(str)))
例:
var imgsrc = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(markup)));
var img = new Image(1, 1); // width, height values are optional params
img.src = imgsrc;
如果需要解码该base64,请使用以下命令:
var str2 = decodeURIComponent(escape(window.atob(b64)));
console.log(str2);
例:
var str = "äöüÄÖÜçéèñ";
var b64 = window.btoa(unescape(encodeURIComponent(str)))
console.log(b64);
var str2 = decodeURIComponent(escape(window.atob(b64)));
console.log(str2);
如果您需要将此内容用于移动浏览器,则可能需要从base64数据中删除所有空白…
function b64_to_utf8( str ) {
str = str.replace(/\s/g, '');
return decodeURIComponent(escape(window.atob( str )));
}
这个问题一直困扰着我。 一个简单的事实是,atob并不真正处理UTF8字符串-仅是ASCII。另外,我不会使用像js-base64这样的膨胀软件。 但是webtoolkit确实有一个很小,很好且非常可维护的实现:
/**
*
- Base64 encode / decode
- http://www.webtoolkit.info/
- */
var Base64 = {
// private property
_keyStr: "ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
// public method for encoding
, encode: function (input)
{var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = Base64._utf8_encode(input); while (i < input.length) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >>