处理 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 。
Playing with Emoji
这个网站提供了不同操作系统中 Emoji 形象的功能,很容易进行对比。
https://apps.timwhitlock.info/emoji
Unicode Emoji Charts
Emoji 的官方网站。
http://unicode.org/emoji/charts/
- 文章ID:2663
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/about-emoji/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。