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 中正确读取这些最后的字符?我在这里正确使用编码吗?我应该在阅读之前尝试删除那些0001
s,还是有更简单、不那么愚蠢的方法?
【问题讨论】:
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 字符的主要内容,如果未能解决你的问题,请参考以下文章
如何将4字节utf-8的emoji表情转换为unicode字符编码