JavaScript Base64 编码解码与中文乱码处理详解

作者:闭包旅人时间:2026-10-31 07:00:28浏览:236

本文详解 JavaScript 中 Base64 的编码与解码实现。重点解析原生 btoa/atob 方法处理中文时产生的乱码问题,并提供结合 encodeURIComponent 的修正方案。同时介绍 js-base64 和 is-base64 插件的使用,涵盖安装、导入及封装编码解码函数的完整示例,帮助开发者高效处理字符串转换。

一、原生实现

  • JavaScript 提供了两个用于 Base64 转换的全局内置方法。

1. btoa():用于将字符串或二进制数据转换为 Base64 编码格式。 2. atob():用于将 Base64 编码字符串还原为原始字符。

  • 当处理包含中文的字符串时,直接编码会出现乱码。因此,需要先对字符串进行 URI 组件编码,或者在解码后对结果进行 URI 解码。

1. encodeURIComponent():配合 btoa() 使用,用于预处理待编码字符串。 2. decodeURIComponent():配合 atob() 使用,用于后处理解码结果。

  • 示例:Base64 编码
// btoa() 相当于 window.btoa(),encodeURIComponent 同理
const str = 'test'
const encode = btoa(encodeURIComponent(str))
console.log(encode)	// dGVzdA==
  • 示例:Base64 解码
// atob() 相当于 window.atob(),decodeURIComponent 同理
const str = 'dGVzdA=='
const decode = decodeURIComponent(atob(str))
console.log(decode)	// test
  • 中文乱码处理方法:
const Base64 = {
    encode(str) {
        // 首先,我们使用 encodeURIComponent 来获得百分比编码的UTF-8,然后我们将百分比编码转换为原始字节,最后存储到btoa里面
        return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
            function toSolidBytes(match, p1) {
                return String.fromCharCode(Number('0x' + p1));
            }));
    },
    decode(str) {
        // 过程:从字节流到百分比编码,再到原始字符串
        return decodeURIComponent(atob(str).split('').map(function (c) {
            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
        }).join(''));
    }
}
let encoded = Base64.encode("一颗不甘坠落的流星"); 	// "5LiA6aKX5LiN55SY5Z2g6JC955qE5rWB5pif"
let decoded = Base64.decode(encoded); 				// "一颗不甘坠落的流星"

二、插件实现

  • 推荐使用 Base64 插件:编码与解码功能由 js-base64 提供,判断字符串是否为 Base64 格式的功能由 is-base64 提供。
npm i js-base64
npm i is-base64
  • 插件使用
import isBase64 from 'is-base64';
import { Base64 } from 'js-base64';
// 封装解码函数
const base64ToStr = (base64Str: string): string => {
  if (isBase64(base64Str)) {
    return Base64.decode(base64Str);
  }
  return base64Str;
};
// 封装编码函数
export const strToBase64 = (str: string): string => Base64.encode(str);
console.log(strToBase64('一颗不甘坠落的流星'))	// 5LiA6aKX5LiN55SY5Z2g6JC955qE5rWB5pif
console.log(base64ToStr('5LiA6aKX5LiN55SY5Z2g6JC955qE5rWB5pif'))	// 一颗不甘坠落的流星

总结

到此这篇关于JS如何实现Base64编码和解码及中文乱码问题的文章就介绍到这了,更多相关JS Base64编码和解码内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

作者最新文章