javascript - Unicode 代理项对和 String.fromCodePoint() — JavaScript

标签 javascript unicode hex unicode-escapes surrogate-pairs

我正在处理包含转义序列的原始字符串,用于替代 UTF 星体符号的一半。 (我想我的行话是对的……)

console.log("\uD83D\uDCA9")
// => 💩

让我们以上面的表情符号为例。如果我有代理项对 (\uD83D\uDCA9),我怎样才能依次获取它的十六进制值并将其转换为 Javascript 的 String.fromCodePoint() 函数的有效参数?

我试过以下方法:

const codePoint = ["D83D", "DCA9"].reduce((acc, cur) => {
    return acc += parseInt(cur, 16);
}, 0);

console.log(String.fromCodePoint(codePoint));
// => 𛓦 (some weird symbol appears, not 💩!)

PS:我熟悉 ES6 转义序列,它在括号 {…} 之间显示十六进制值,而不是使用代理项。 但我需要用代理对来做这件事!

非常感谢任何建议。

最佳答案

您可以将值的列表传递给函数:

console.log(String.fromCodePoint(0xd83d, 0xdca9));

因此 String.fromCodePoint() 的“有效参数”不一定是单个值,实际上对于需要代理项对的字符,根据定义不能是一个单一的值(value)。为什么?因为就 String.fromCodePoint() 而言,每个单独的数字源值都必须是 16 位(2 字节)的值。如果您可以传递更大的单个数字,就不需要代理对了!

编辑:上面的大部分内容都不准确; .fromCodePoint() 方法接受完整的 Unicode 代码点值(大于 16 位)。当然,它仍然需要将它们拆分为代理项对,因为 JavaScript 字符串是 UTF-16,但这意味着如果您碰巧拥有完整大小的 Unicode 代码点,则不必自己拆分它们,这很好.但是,如果您确实已经有了对,那么您自己组合它们真的没有意义,因为当作为点列表的一部分传递时,该方法也适用于对。

如果数组中有值,则可以使用 apply 调用该函数:

var points = [0xd83d, 0xdca9];
console.log(String.fromCodePoint.apply(String, points));

关于javascript - Unicode 代理项对和 String.fromCodePoint() — JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53873611/

相关文章:

c - 十六进制转换为无符号整数

javascript - 将鼠标悬停/鼠标进入/鼠标离开菜单项

javascript - 单击密码切换器时显示/保留键盘

Perl - 将 PC UTF-8 转换为 PC ANSI

vim - 在 vim 中更改文本外观

python - 如何在python中将负整数值转换为十六进制

javascript - 基于HTML5数据元素的jQuery刷新div

javascript - 取出字符串中所有其他单词的算法?

html - ☺ 不在移动版本中呈现

javascript - 将gray60 转换为rgb |图像魔法