识别输入文字中的表情符号

时间:2019-09-04 11:23:57

标签: javascript android google-chrome webview emoji

在我的Android / Cordova混合应用程序中,我希望允许用户将表情符号与描述性的“句柄” /名称相关联。我发现,在Android 8+中,默认HTML输入框-记住这是一个混合应用程序,因此UI实际上是直接从Chrome派生的WebView-可以简单地切换到Emoji键盘并选择一个Emoji。我的理解是这些表情符号来自Google的Noto字体项目。我希望用户能够输入表情符号+手柄的格式为

? handle

其中句柄必须为字母数字。使用正则表达式测试字母数字部分和前面的空格不是问题。但是,我还想检查一下前两个字节是否是表情符号(不是必须的)。同样,可以通过将前两个字符设为userhandle.charCodeAt(0|1)来完成此操作。

要检查由此返回的数字的有效性,我需要知道什么构成有效的Noto字体表情符号代码。 This article似乎建议所有有效的表情符号都应具有0xF09fF or 0xE29C`作为Char 0处的值-为了简化起见,我将忽略该资源中列出的三字节表情符号。

但是,在执行此操作之前,我想知道-是否存在一种确定的方法来验证我在这里不知道的Emoji unicode?

1 个答案:

答案 0 :(得分:4)

article提供了有关javascript中表情符号的许多详细信息,并提供了可使用的正则表达式。我认为这适用于所有表情符号,但您需要对其进行测试。

在这里,我将使用?表情符号测试表情符号:

/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*/.test(String.fromCodePoint("?".codePointAt(0)))  //returns true

使用相同的正则表达式,但测试“ A”字符:

/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*/.test(String.fromCodePoint("A".codePointAt(0)))  //returns false

如果只想获取代码点,则可以使用:

"?".codePointAt(0)  //returns 127828