我正在使用表情符号,但我遇到了这样的情况,即表情符号可以分为多个部分(因为表情符号的长度为>1
),最后我得到了一个符号。
如何获取它的真实(字符串)值?
如果我正确理解,则符号是一个通用的``破损''符号,根据情况可能会有不同的值。例如,下面的硬编码比较不起作用,因为尽管myVar
会退出�符号,但底层的值/字符串却不同:
if (myVar === "�") // ...enter code here
答案 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
进一步阅读