识别键入文本中的表情符号
Recognising Emojis in typed text
在我的混合 Android/Cordova 应用程序中,我希望允许用户将表情符号与描述性 "handle"/名称相关联。我发现在 Android 8+ 中默认的 HTML 输入框 - 记住这是一个混合应用程序所以 UI 实际上是直接从 Chrome 派生的 WebView - 它是可以简单地切换到表情符号键盘并选择一个表情符号。我的理解是这些表情符号来自 Google 的 Noto 字体项目。我希望用户能够用于输入表情符号 + 句柄的格式是
handle
句柄必须是字母数字。使用正则表达式测试字母数字部分和前面的 space 不是问题。但是,我还想检查前两个字节是否是表情符号(不是强制性的)。同样,这可以通过将前两个字符设为 userhandle.charCodeAt(0|1)
来完成。
要检查由此返回的数字的有效性,我需要知道什么是有效的 Noto 字体表情符号代码。 This article 似乎建议所有有效的表情符号都应将 0xF09fFor
0xE29C` 作为 Char 0 的值 - 为了简单起见,我将忽略该资源中列出的无效的三字节表情符号。
但是,在我实施这个之前,我想知道 - 是否有一种我在这里不知道的验证表情符号 unicode 的既定方法?
这个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
在我的混合 Android/Cordova 应用程序中,我希望允许用户将表情符号与描述性 "handle"/名称相关联。我发现在 Android 8+ 中默认的 HTML 输入框 - 记住这是一个混合应用程序所以 UI 实际上是直接从 Chrome 派生的 WebView - 它是可以简单地切换到表情符号键盘并选择一个表情符号。我的理解是这些表情符号来自 Google 的 Noto 字体项目。我希望用户能够用于输入表情符号 + 句柄的格式是
handle
句柄必须是字母数字。使用正则表达式测试字母数字部分和前面的 space 不是问题。但是,我还想检查前两个字节是否是表情符号(不是强制性的)。同样,这可以通过将前两个字符设为 userhandle.charCodeAt(0|1)
来完成。
要检查由此返回的数字的有效性,我需要知道什么是有效的 Noto 字体表情符号代码。 This article 似乎建议所有有效的表情符号都应将 0xF09fFor
0xE29C` 作为 Char 0 的值 - 为了简单起见,我将忽略该资源中列出的无效的三字节表情符号。
但是,在我实施这个之前,我想知道 - 是否有一种我在这里不知道的验证表情符号 unicode 的既定方法?
这个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