【问题标题】:How to base64 encode emojis in JavaScript?如何在 JavaScript 中对表情符号进行 base64 编码?
【发布时间】:2019-06-18 11:08:26
【问题描述】:

我一直在尝试将 twitter 嵌入代码编码到 base64 中,该代码可能包含也可能不包含一个或多个表情符号。因此,当字符串中有表情符号时,我会收到此错误: Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

有什么我可以做的,当我在我的字符串上运行 btoa() 时,它会编码整个字符串,包括表情符号,当我在 php 中使用 base64_decode 对其进行解码时,表情符号会再次出现?

提前致谢!

【问题讨论】:

  • 何必呢?它是一个文本字符串。它不是二进制的。将其转换为 ASCII 有什么意义?您通过什么系统传输无法处理 UTF-8 的数据?
  • @Quentin,它是使用 JavaScript 生成的短代码,然后由 PHP 解释。如果我直接传数据不编码的话,所有的引号都弄得一团糟,还没有找到逃避各种引号的办法。
  • JSON 是传统的

标签: javascript encoding base64


【解决方案1】:

你可以先转义,然后调用 EncodeUriComponent 对其进行编码。

看起来像这样:

btoa(unescape(encodeURIComponent('?')));

上面的表情符号会返回 "8J+Ygg=="

要解码它,你会这样做

decodeURIComponent(escape(window.atob('8J+Ygg==')));

您可以创建两个函数来简化此操作:

//Encode
function utoa(str) {
    return window.btoa(unescape(encodeURIComponent(str)));
}
//Decode
function atou(str) {
    return decodeURIComponent(escape(window.atob(str)));
}

来源: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa

【讨论】:

  • escape 不是 unicode 安全的,因此已弃用。 escape 是一种用 ASCII 表示数据的方法。 btoa 是用 ASCII 表示数据的另一种方式。将它们结合起来完全没有意义。
  • encodeURIComponent 是我所需要的——不再需要 base64
  • 运行示例时,我在 Google Chrome v91 上看不到任何内容
【解决方案2】:

使用js-base64库作为

var str = "I was funny ?";
console.log("Original string:", str);

var encodedStr = Base64.encode(str)
console.log("Encoded string:", encodedStr);

var decodedStr = Base64.decode(encodedStr)
console.log("Decoded string:", decodedStr);
<script src="https://cdn.jsdelivr.net/npm/js-base64@2.5.2/base64.min.js"></script>

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2011-04-16
    • 2016-05-28
    • 2017-11-11
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多