处理 Emoji

**2018-04-12更新: ** 加入使用 unicodedata 的代码范例。

Emoji 是 Unicode 字符集的一部分。目前我看过的最好的介绍 unicode 的文章是这一篇: 写给程序员的 Unicode 入门介绍

程序员经常要处理 Emoji 。在微信流行起来之后,许多使用微信作为第三方账号登录的 App/Game 都面临处理 Emoji 的问题,因为微信的昵称中可以包含 Emoji。

本文介绍一些处理 Emoji 的相关信息,不展开。

操作系统支持

Emoji 是需要操作系统支持的。每个操作系统实现的 Emoji 不太相同。Windows/iOS/Android/macOS 的最新版本都对 Emoji 提供了支持。

想看一下不同操作系统下的同一个 Emoji 形象有何不同,可以看这里: Emoji Unicode Tables

Android

Android 4.4 开始支持完整的 Emoji 列表。在输入法中就能打开 Emoji 面板。

iOS

iOS 8.3 开始支持完整的 Emoji 。原生键盘上就提供了 Emoji 面板。

macOS

macOS Sierra 10.12 中,直接按下 Command - Control - Spacebar 组合键就能打开 Emoji 面板。

Windows

Windows 10 和 Windows 8.1 的触摸键盘提供了对 Emoji 的面板支持。

数据库支持

对于 MySQL 来说,如果需要存储 Emoji 编码,需要在 MySQL 5.5.3 或更高版本中启用 utf8mb4 编码。

使用正则表达式替换 Emoji

最简单的处理方案就是把字符串中的 Emoji 清除掉。

在 Javascript 中,可以采用下面的代码(不保证完整):

 1/**
 2 * 过滤掉字符中的emoji
 3 * @param strWithEmoji
 4 * @returns {string}
 5 */
 6Utils.clearEmoji = function (strWithEmoji) {
 7  if (strWithEmoji) {
 8    return strWithEmoji.replace(/([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])/g, '')
 9  }
10  return ''
11}

在 Python 3.3 或更高版本中,可以考虑使用下面的代码:

 1import re
 2
 3EMOJI_RE = re.compile(ur"""
 4    [\U0001F600-\U0001F64F] # emoticons
 5    |
 6    [\U0001F300-\U0001F5FF] # symbols & pictographs
 7    |
 8    [\U0001F680-\U0001F6FF] # transport & map symbols
 9    |
10    [\U0001F1E0-\U0001F1FF] # flags (iOS)
11""", re.VERBOSE)
12
13def clear_emoji(str_with_emoji):
14    if str_with_emoji:
15        return EMOJI_RE.sub(str_with_emoji, '')
16    return ''

使用库工具

Python 自带一个 unicodedata 库,提供了 unicode 转换功能。

下面的 replace_emoji 方法就使用 unicodedata 提供的功能来进行转换(当然,没有考虑性能问题):

 1def replace_emoji(self, input_string):
 2    for character in input_string:
 3        try:
 4            character.encode("ascii")
 5            return_string += character
 6        except UnicodeEncodeError:
 7            replaced = str(character)
 8            if replaced != '':
 9                return_string += replaced
10            else:
11                try:
12                    return_string += "[" + unicodedata.name(character) + "]"
13                except ValueError:
14                    return_string += "[x]"
15    return return_string

emoji-cheat-sheet.com 项目则提供了大量的库可供选择,包括 Ruby/Javascript/Objective-C/Java/Python/Swift 。

例如对于 Python 中的库 emoji,只需要简单的代码就能在 Emoji 和 :name: 形式见互相转换:

1import emoji
2
3print(emoji.demojize('Hello 🌊'))
4# 'Hello :water_wave:'
5print(emoji.emojize('Hello :water_wave:'))
6# 'Hello 🌊'

其它

Emoji-Helper

一个浏览器插件,支持在浏览器中显示 Emoji。

http://johannh.me/emoji-helper/

getemoji.com

一个介绍 Emoji 的网站,可以在上面查看和复制 Emoji 。

http://getemoji.com/

Playing with Emoji

这个网站提供了不同操作系统中 Emoji 形象的功能,很容易进行对比。

https://apps.timwhitlock.info/emoji

Unicode Emoji Charts

Emoji 的官方网站。

http://unicode.org/emoji/charts/

全文完