首页 > 解决方案 > 比较 UTF-16 中的性别表情符号

问题描述

我制作了一个程序,它读取输入字符串,比较它以检查它是否是某个表情符号,并根据它是哪个表情符号返回一个数字。

问题来自不同类型的表情符号。例如,警察表情符号不会被检测到。我尝试将字符串与“‍”进行比较,但未检测到。我尝试添加男性符号并将字符串与“‍♂️♂️”进行比较,但它也不起作用。

我的一段代码示例:

                case "":
                case "":
                    Send(args[1] + " 70%", update.Message.Chat.Id);
                    break;
                case "":
                case "":
                case "":
                case "":
                    Send(args[1] + " 40%", update.Message.Chat.Id);
                    break;

除了 和 之外,所有这些都有效,它们恰好是具有不同性别的那些。

不确定这是否重要,但语言是 C#,我正在 Visual Studio 中编程,这让我可以将表情符号复制并粘贴到那里。

我究竟做错了什么?

标签: emojiutf-16utf

解决方案


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

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

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

在源代码中,我会将 ‍ 作为注释放在案例语句的字符串中,警官使用转义码点“\U0001F46E”。

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

或者

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

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

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


推荐阅读