比较UTF-16中的性别表情符号

时间:2019-02-22 17:35:10

标签: emoji utf-16 utf

我制作了一个程序,该程序读取输入的字符串,将其进行比较以检查它是否是特定的表情符号,并根据其是哪个表情符号返回一个数字。

问题来自于不同风格的表情符号。例如,未检测到警察表情符号。我尝试将字符串与“ ‍”进行比较,但未检测到。我尝试添加男性符号,然后将字符串与“ ‍♂️♂️”进行比较,但这也没有用。

我的一段代码示例:

let hexArray = ["2F", "24", "40", "2A"]
let characterArray = hexArray.compactMap({ (hexString) -> Character? in
    guard let unicodeScalarValue = Int(hexString, radix: 16),
        let unicodeScalar = Unicode.Scalar(unicodeScalarValue) else {
            return nil
    }
    return Character(unicodeScalar)
})
print(characterArray) // prints: ["/", "$", "@", "*"]

除了和之外,其他所有人都工作,这恰好是性别不同的人。

不确定是否重要,但是语言是C#,并且我正在Visual Studio中编程,因此我可以在其中复制和粘贴表情符号。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

  

我尝试将字符串与“ ‍”进行比较,但未检测到。

上面的这个警察表情符号由两个Unicode“字符”(更好地称为代码点)组成:警察U + 1F46E和一个字符修饰符U + 200D(上面四个点的组合)。如果在案例陈述中您只有警务人员U + 1F46E,则不会找到它。

您必须确保您粘贴在代码中的表情符号与您在输入字符串中收到的表情符号相同。仅显示字符串是令人困惑的,因为它们看上去相等但不相等。

在源代码中,我将使用‍作为注释,并在案例声明的字符串中使用“ \ U0001F46E”转义为Codepoint的警务人员。

case "\U0001F46E":        // ‍
case "\U0001F46E\u200D":  // ‍ + ....

const string PoliceOfficer = "\U0001F46E" // ‍
...
case PoliceOfficer: 

请注意不同的转义,上\ U为8个十六进制数字,下\ u为4个十六进制数字。 然后,当您无法识别字符串时,只需将其打印出来(最终在调试器中),获得正确的转义符即可构建字符串并将其添加到case语句中。

作为替代方案,您可以首先从输入字符串中删除所有组合标记,例如“ \ u200D”,然后将其传递到case语句。然后最终为组合字符赋予其他含义。