首页  >  文章  >  web前端  >  如何在处理 UTF-8 编码的同时在 JavaScript 中解码 Base64 字符串?

如何在处理 UTF-8 编码的同时在 JavaScript 中解码 Base64 字符串?

Barbara Streisand
Barbara Streisand原创
2024-11-01 13:10:02453浏览

How to Decode Base64 Strings in JavaScript While Handling UTF-8 Encoding?

使用 JavaScript atob 函数解码 Base64:处理 UTF-8

JavaScript 的 atob() 函数旨在解码 Base64 编码的字符串。用户在解码 UTF-8 编码字符串时可能会遇到问题,导致生成 ASCII 编码字符而不是正确的 UTF-8 表示形式。

挑战:理解 Unicode 问题

Base64 需要二进制数据作为输入,JavaScript将字符占据一个字节的字符串视为二进制数据。然而,在 UTF-8 编码字符串中占用超过 1 个字节的字符在编码过程中会触发异常。

解决方案 1:二进制互操作性

建议的修复方法是编码和解码二进制字符串:

将 UTF-8 编码为二进制

function toBinary(string) {
  const codeUnits = new Uint16Array(string.length);
  for (let i = 0; i < codeUnits.length; i++) {
    codeUnits[i] = string.charCodeAt(i);
  }
  return btoa(String.fromCharCode(...new Uint8Array(codeUnits.buffer)));
}

将二进制解码为 UTF-8

function fromBinary(encoded) {
  const binary = atob(encoded);
  const bytes = new Uint8Array(binary.length);
  for (let i = 0; i < bytes.length; i++) {
    bytes[i] = binary.charCodeAt(i);
  }
  return String.fromCharCode(...new Uint16Array(bytes.buffer));
}

此解决方案将将原始 UTF-8 字符串转换为二进制表示形式,保留 UTF-16 编码(JavaScript 中的本机表示形式)。

解决方案 2:ASCII Base64 互操作性

专注于 UTF-8 互操作性的替代解决方案是维护明文base64字符串:

将UTF-8编码为Base64

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

将Base64解码为UTF-8

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

此解决方案可有效处理 UTF-8 编码字符串,而不改变其表示形式。

TypeScript 支持

// Encoding UTF-8 ⇢ base64

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

// Decoding base64 ⇢ UTF-8

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

历史解决方案(已弃用)

function utf8_to_b64( str ) {
  return window.btoa(unescape(encodeURIComponent( str )));
}

function b64_to_utf8( str ) {
  return decodeURIComponent(escape(window.atob( str )));
}

虽然仍然有效,但这种方法现在在现代浏览器中已被弃用。

以上是如何在处理 UTF-8 编码的同时在 JavaScript 中解码 Base64 字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn