'❌'[0] === '❌' // true
'✔️'[0] === '✔️' // false
'✔️'[0] === '✔' // true
我怀疑它与unicode有关,但我想准确地理解发生了什么,以及如何正确地比较这些字符。为什么"✔️"one_answers"❌"区别对待?
我在这个简单的字符计数
中遇到了它'✔️❌✔️❌'.split('').filter(e => e === '❌').length // 2
'✔️❌✔️❌'.split('').filter(e => e === '✔️').length // 0
因为✔️
有两个字符:"✔️".length === 2
我认为"✔️"[0] === "✔"
和"✔️"[1]
表示颜色。
和"❌".length === 1
,所以只有一个字符
这与不同肤色的表情符号的工作方式相似。
至于如何比较,我认为"✔️".codePointAt(0)
(不要与charCodeAt()
混淆)可能会有所帮助。见https://thekevinscott.com/emojis-in-javascript/:
codePointAt和fromCodePoint是ES2015中引入的新方法,可以处理UTF-16编码大于16位的unicode字符,其中包括表情符号。使用这些代替charCodeAt,它不能正确处理表情符号。
我相信'✔️'是由2个组件组成的。当您输出'✔️'[0]时,您得到'✔',并且黑色复选标记不等于绿色复选标记。
但是,'❌'只由一个组件组成,所以当您输出'❌'[0]时,您得到的是相同的东西:'❌'。
第二个字符'✔️'[1]
(代码点= 65039)是Variation Selector
变异选择器指定前面的字符应该与表情符号一起显示演示。仅当前一个字符默认为时才需要文本表示。
常用于表情符号ZWJ序列中,其中序列有文字和表情符号表示,但默认为文字(黑白)显示。
雪人作为文本的例子:雪人的表情符号:☃️
黑色的心作为文本:❤。黑心作为表情符号:❤️(不那么黑)
Variation Selector-16在2002年被批准为Unicode 3.2的一部分。
https://unicode-table.com/en/FE0F/