我有一个PHP脚本,可以将PNG图像编码为Base64字符串。

我想用JavaScript做同样的事情。我知道如何打开文件,但我不知道如何进行编码。我不习惯使用二进制数据。


当前回答

为了使Base64编码的字符串URL友好,在JavaScript中你可以这样做:

// if this is your Base64 encoded string
var str = 'VGhpcyBpcyBhbiBhd2Vzb21lIHNjcmlwdA=='; 

// make URL friendly:
str = str.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');

// reverse to original encoding
str = (str + '===').slice(0, str.length + (str.length % 4));
str = str.replace(/-/g, '+').replace(/_/g, '/');

参见这个小提琴:http://jsfiddle.net/magikMaker/7bjaT/

其他回答

我宁愿使用CryptoJS中的Base64编码/解码方法,这是使用最佳实践和模式在JavaScript中实现的最流行的标准和安全加密算法库。

您可以使用btoa()和atob()来转换base64编码。

关于这些函数接受/返回什么,评论中似乎有一些混淆,所以…

btoa() accepts a “string” where each character represents an 8-bit byte – if you pass a string containing characters that can’t be represented in 8 bits, it will probably break. This isn’t a problem if you’re actually treating the string as a byte array, but if you’re trying to do something else then you’ll have to encode it first. atob() returns a “string” where each character represents an 8-bit byte – that is, its value will be between 0 and 0xff. This does not mean it’s ASCII – presumably if you’re using this function at all, you expect to be working with binary data and not text.

参见:

如何使用Javascript和XMLHttpRequest加载二进制图像数据?


这里的大多数评论都过时了。您可能同时使用btoa()和atob(),除非您支持非常过时的浏览器。

检查:

https://caniuse.com/?search=atob https://caniuse.com/?search=btoa

如果您正在使用Dojo。它为我们提供了编码或解码为Base64的直接方法。

试试这个:

使用dojox.encoding.base64对字节数组进行编码:

var str = dojox.encoding.base64.encode(myByteArray);

解码一个base64编码的字符串:

var bytes = dojox.encoding.base64.decode(str);

我已经手工重写了这些编码和解码方法,除了十六进制的编码方法外,它们都是模块化格式的,以便跨平台/浏览器兼容,并且还具有真正的私有作用域,如果它们由于速度而存在,则使用btoa和atob,而不是利用自己的编码:

https://gist.github.com/Nijikokun/5192472

用法:

base64.encode(/* String */);
base64.decode(/* String */);

utf8.encode(/* String */);
utf8.decode(/* String */);

这个问题和它的答案为我指明了正确的方向。 特别是Unicode, atob和btoa不能“香草”使用,这些天所有的东西都是Unicode…

直接来自Mozilla的两个很好的函数。 使用Unicode和HTML标签进行测试:

function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    }));
}

b64EncodeUnicode('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="
b64EncodeUnicode('\n'); // "Cg=="


function b64DecodeUnicode(str) {
    return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
}

b64DecodeUnicode('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"
b64DecodeUnicode('Cg=='); // "\n"

与使用自定义JavaScript函数的原始Base64解码相比,这些函数将以闪电般的速度执行,因为btoa和atob在解释器外部执行。

如果你可以忽略旧的ie浏览器和旧的手机(比如iPhone 3?),这应该是一个很好的解决方案。