Python - 读取 Emoji Unicode 字符

Posted

技术标签:

【中文标题】Python - 读取 Emoji Unicode 字符【英文标题】:Python - Reading Emoji Unicode Characters 【发布时间】:2015-09-25 15:11:52 【问题描述】:

我有一个 Python 2.7 程序,它从 SQLite 数据库读取 ios 文本消息。文本消息是 unicode 字符串。在以下短信中:

u'that\u2019s \U0001f63b'

撇号由\u2019 表示,但表情符号由\U0001f63b 表示。我查找了相关表情符号的代码点,它是\uf63b。我不确定0001 来自哪里。我对字符编码知之甚少。

当我逐个字符打印文本时,使用:

s = u'that\u2019s \U0001f63b'

for c in s:
    print c.encode('unicode_escape')

程序产生以下输出:

t
h
a
t
\u2019
s

\ud83d
\ude3b

如何在 Python 中正确读取这些最后的字符?我在这里正确使用编码吗?我应该在阅读之前尝试删除那些0001s,还是有更简单、不那么愚蠢的方法?

【问题讨论】:

0xf63b 位于 Unicode 的“私人使用”部分。你确定这是正确的吗?您的代码点可能是 0x1f63b,因为那是“心眼微笑的猫”表情符号。 您如何确定\uf63b 是表情符号字符?根据我的参考,它是未定义的:fileformat.info/info/unicode/char/f63b/index.htm 【参考方案1】:

我认为您没有正确使用编码,也不需要这样做。您拥有的是一个有效的 unicode 字符串,其中包含一个 4 位和一个 8 位转义序列。在 OS X 上的 REPL 中试试这个

>>> s = u'that\u2019s \U0001f63b'
>>> print s
that’s ?

在 python3 中,虽然 -

Python 3.4.3 (default, Jul  7 2015, 15:40:07) 
>>> s  = u'that\u2019s \U0001f63b'
>>> s[-1]
'?'

【讨论】:

好吧,你看看那个...我真的什么都不知道。谢谢!不过,我仍然不清楚如何阅读最后一个字符。 s[-1] 和 s[-2] 仍然给出 '\ud83d' 和 '\ude3b'。有没有办法逐个字符读取字符串? @alaprise 您看到了 Python 在内部存储其 Unicode 字符串的方式的产物。如果你在 Python 3 中做同样的事情,你会看到完全不同的东西。 @alaprise 另一个答案有一些很好的信息,其中摘要是“如果可能的话,请移至 Python3”。否则,您将进入一个痛苦/代理对/您不想知道的词的世界,因为它们是克苏鲁之歌 '\ud83d' 和 '\ude3b' 是代理对,UTF-16 使用它来表示U+FFFF 之上的代码点。这是 Python 2 中的一个错误,很多语言都存在这些字符的问题。 @roeland: s[-1] == u'\U0001f63b' 在我的机器上运行 Python 2 和 3 ("wide Python builds" are supported since 2001)【参考方案2】:

您最后的困惑可能是因为您正在运行所谓的“窄 Python 构建”。 Python 无法容纳具有足够信息的单个字符来容纳单个表情符号。最好的解决方案是迁移到 Python 3。否则,请尝试处理 UTF-16 surrogate pair。

【讨论】:

regex.findall(r'\X', unicode_text) 可用于获取可能跨越多个 Unicode 代码点的“用户感知字符”(它与代理对无关,但它应该作为副作用解决该问题)。

以上是关于Python - 读取 Emoji Unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章

Unicode码和Emoji表情

emoji Unicode characters

新的emoji表情只有iPhone机有么?安卓机能用么

如何将4字节utf-8的emoji表情转换为unicode字符编码

R - Emoji unicode to character

Android 上的 Unicode 到 Emoji