Base64 是一种常见的编码格式,用于将二进制数据转换为 ASCII 字符串,以便在文本协议中传输。Base64 编码不是加密,而是一种编码方式,可以轻松地进行解码。
Base64 编码使用 64 个字符来表示二进制数据。这些字符包括大写字母(A-Z)、小写字母(a-z)、数字(0-9)以及符号(+ 和 /)。Base64 编码后的字符串通常比原始二进制数据长约 33%。
Base64 编码有几种变体,包括标准 Base64、URL 安全的 Base64 和 MIME Base64。
以下是 JavaScript 中进行 Base64 编码和解码的示例代码:
// 编码
const encodedString = btoa('Hello, World!');
console.log(encodedString); // 输出: "SGVsbG8sIFdvcmxkIQ=="
// 解码
const decodedString = atob(encodedString);
console.log(decodedString); // 输出: "Hello, World!"
问题描述:当字符串包含特殊字符(如 +
, /
, =
)时,Base64 编码可能会导致问题。
解决方法:使用 URL 安全的 Base64 编码,将 +
替换为 -
,将 /
替换为 _
,并去掉末尾的 =
。
function base64UrlEncode(str) {
return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
function base64UrlDecode(str) {
str = (str + '==='.slice((str.length + 3) % 4)).replace(/-/g, '+').replace(/_/g, '/');
return atob(str);
}
const encodedUrlSafe = base64UrlEncode('Hello, World!');
console.log(encodedUrlSafe); // 输出: "SGVsbG8sIFdvcmxkIQ"
const decodedUrlSafe = base64UrlDecode(encodedUrlSafe);
console.log(decodedUrlSafe); // 输出: "Hello, World!"
问题描述:当字符串包含 Unicode 字符时,直接使用 btoa
和 atob
可能会导致错误。
解决方法:先将字符串转换为 UTF-8 编码的二进制数据,再进行 Base64 编码和解码。
function utf8ToBase64(str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
function base64ToUtf8(str) {
return decodeURIComponent(atob(str).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
}
const encodedUtf8 = utf8ToBase64('你好,世界!');
console.log(encodedUtf8); // 输出: "5L2g5aW977yM5LiW55WM"
const decodedUtf8 = base64ToUtf8(encodedUtf8);
console.log(decodedUtf8); // 输出: "你好,世界!"
通过这些方法,可以有效地处理 Base64 编码中的常见问题。
领取专属 10元无门槛券
手把手带您无忧上云