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

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

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

使用库工具

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

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

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

1
2
3
4
5
6
import emoji
print(emoji.demojize('Hello 🌊'))
# 'Hello :water_wave:'
print(emoji.emojize('Hello :water_wave:'))
# '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/

全文完

留言