如何获得符号实值?

时间:2019-04-03 15:21:23

标签: javascript

我正在使用表情符号,但我遇到了这样的情况,即表情符号可以分为多个部分(因为表情符号的长度为>1),最后我得到了一个符号。

如何获取它的真实(字符串)值?


如果我正确理解,则符号是一个通用的``破损''符号,根据情况可能会有不同的值。例如,下面的硬编码比较不起作用,因为尽管myVar会退出�符号,但底层的值/字符串却不同:

if (myVar === "�") // ...enter code here

1 个答案:

答案 0 :(得分:2)

可以将字符串中的字符替换为其相应的unicode转义序列。例如,

"A" === "\u0041"

不过,0x0000 - 0xFFFF范围内的任何字符(例如表情符号)都需要分解为“代理对”。例如,

"?" === "\uD83C\uDF2F"
//         ^     ^
//         A     B
//
// A: first half
// B: second half

"?".length === 2的原因是什么!

将这些两半放在一起在屏幕上打印一个a。但是,如果将它们分开,它们将成为这些“破碎”符号:

"?".split("")
//=>  ["�", "�"]

计算出后,�符号代表许多不同的值。要了解蒙版后面的内容,您可以简单地使用String#charCodeAt,例如

"?".split("").map(c => c.charCodeAt(0))
//=> [55356, 57135]

或针对其十六进制值:

"?".split("").map(c => c.charCodeAt(0).toString(16))
//=> ["d83c", "df2f"]

如何检测破损的表情符号?

"Hello ?".slice(0, -1)
//=> "Hello �"

我们可以使用带有u标志和unicode property escape的正则表达式来匹配代理:

const broken_emoji = /\p{Surrogate}/u;

broken_emoji.test("Hello ?");
//=> false

broken_emoji.test("Hello ?".slice(0, -1));
//=> true

进一步阅读