📌  相关文章
📜  未捕获的 DOMException:无法在“Window”上执行“btoa”:要编码的字符串包含 Latin1 范围之外的字符. - Javascript(1)

📅  最后修改于: 2023-12-03 15:26:31.863000             🧑  作者: Mango

未捕获的 DOMException:无法在“Window”上执行“btoa”:要编码的字符串包含 Latin1 范围之外的字符.

在进行 JavaScript 字符串编码时,有些字符可能会超出 Latin1 范围,这时候就会出现上述错误。

原因分析

在 JavaScript 中,通常可以使用 btoa() 方法将字符串转换为 Base64 编码。但是该方法只能处理 Latin1 范围内的字符,如果字符串中含有 Latin1 范围外的字符(如中文等),就会出现以上错误。

解决方案
方案一:使用全局变量

btoa() 方法只能在浏览器环境中使用,而且只能作用于全局对象 window。因此,在代码中使用该方法时需要判断当前环境是否支持该方法,以及是否存在 window 对象。

if (typeof window !== "undefined" && typeof window.btoa === "function") {
  // 调用 btoa() 方法
} else {
  // 执行其他操作
}
方案二:使用第三方库

如果想要在 JavaScript 中处理超出 Latin1 范围的字符,可以使用第三方库,例如 js-base64base64-js 等。在使用这些库时,需要注意调用的方法和参数,具体操作参考库的文档。

方案三:手动实现 Base64 编码

手动实现 Base64 编码并不复杂,只需要利用 JavaScript 中的一些原生方法就可以了。以下是一个简单的实现过程:

function base64Encode(str) {
  let base64EncodeChars =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  let out, i, len;
  let c1, c2, c3;
  len = str.length;
  i = 0;
  out = "";
  while (i < len) {
    c1 = str.charCodeAt(i++) & 0xff;
    if (i === len) {
      out += base64EncodeChars.charAt(c1 >> 2);
      out += base64EncodeChars.charAt((c1 & 0x3) << 4);
      out += "==";
      break;
    }
    c2 = str.charCodeAt(i++);
    if (i === len) {
      out += base64EncodeChars.charAt(c1 >> 2);
      out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4));
      out += base64EncodeChars.charAt((c2 & 0xf) << 2);
      out += "=";
      break;
    }
    c3 = str.charCodeAt(i++);
    out += base64EncodeChars.charAt(c1 >> 2);
    out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4));
    out += base64EncodeChars.charAt(((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6));
    out += base64EncodeChars.charAt(c3 & 0x3f);
  }
  return out;
}

使用该方法时,需要将字符串作为参数传入,返回经过 Base64 编码后的字符串。如果需要解码,则需要使用其他方法实现。