【问题标题】:How to display/convert a string of utf-8 to the proper symbol如何将 utf-8 字符串显示/转换为正确的符号
【发布时间】:2015-06-02 04:29:12
【问题描述】:

我有一个列表,其中包含编码为 utf-8 字符的 WhatsApp 表情符号。我用来解码表情符号的表位于http://apps.timwhitlock.info/emoji/tables/unicode

通过这个表,我试图计算使用的表情符号的数量,我已经使用正则表达式技术成功地完成了这项工作。问题是我创建了一个字典,其中键是 utf-8 字符作为字符串,而 key_values 是整数。以下:

print d_emo
for k, v in d_emo.items():
    print k.encode('utf8'), v

产生这个输出:

{'\\xF0\\x9F\\x98\\xA2': 2, '\\xF0\\x9F\\x98\\x82': 1, '\\xF0\\x9F\\x98\\x86': 2, '\\xF0\\x9F\\x98\\x89': 1, '\\xF0\\x9F\\x8D\\xB5': 2, '\\xF0\\x9F\\x8D\\xB0': 4, '\\xF0\\x9F\\x8D\\xAB': 2, '\\xF0\\x9F\\x8D\\xA9': 2, '\\xF0\\x9F\\x98\\x98': 1, '\\xE2\\x98\\xBA': 33, '\\xE2\\x98\\x95': 1}
\xF0\x9F\x98\xA2 2
\xF0\x9F\x98\x82 1
\xF0\x9F\x98\x86 2
\xF0\x9F\x98\x89 1
\xF0\x9F\x8D\xB5 2
\xF0\x9F\x8D\xB0 4
\xF0\x9F\x8D\xAB 2
\xF0\x9F\x8D\xA9 2
\xF0\x9F\x98\x98 1
\xE2\x98\xBA 33
\xE2\x98\x95 1

如果我使用此代码:

for k, v in d_emo.items():
    print k.encode('utf-8').decode('unicode_escape'), v

我明白了

ð¢ 2
ð 1
ð 2
ð 1
ðµ 2
ð° 4
ð« 2
ð© 2
ð 1
⺠33
â 1

我应该得到笑脸之类的。有什么建议么?这是在 Python 2.7 中。

【问题讨论】:

  • 您使用的字体是否包含表情符号的所有字形?
  • @RobbyCornelissen 是的。当我使用 *.readlines() 读取原始文本文件并打印 * 时,它会显示正确的表情符号
  • 您的意见是什么(显示print repr(your_input))?您的问题中显示的不是 utf-8 数据。
  • 您也可以使用pypi.python.org/pypi/emoji,例如python -c "import emoji ; print(emoji.emojize('Python is :thumbsup:', use_aliases=True))"

标签: python unicode encoding utf-8


【解决方案1】:

这将正确解码 Unicode 字符,但在 Python 2.X 中,使用 BMP 之外的字符(基本多语言平面,字符 U+0000 到 U+FFFF)时会受到一定限制:

import unicodedata as ud
D = {'\\xF0\\x9F\\x98\\xA2': 2, '\\xF0\\x9F\\x98\\x82': 1, '\\xF0\\x9F\\x98\\x86': 2, '\\xF0\\x9F\\x98\\x89': 1, '\\xF0\\x9F\\x8D\\xB5': 2, '\\xF0\\x9F\\x8D\\xB0': 4, '\\xF0\\x9F\\x8D\\xAB': 2, '\\xF0\\x9F\\x8D\\xA9': 2, '\\xF0\\x9F\\x98\\x98': 1, '\\xE2\\x98\\xBA': 33, '\\xE2\\x98\\x95': 1}
for k,v in D.iteritems():
    k = k.decode('unicode-escape').encode('latin1').decode('utf8')
    try:
        n = ud.name(k)
    except ValueError:
        n = 'no such name'
    print k,repr(k),n

输出:

☺ u'\u263a' WHITE SMILING FACE
? u'\U0001f369' no such name
☕ u'\u2615' HOT BEVERAGE
? u'\U0001f602' no such name
? u'\U0001f36b' no such name
? u'\U0001f622' no such name
? u'\U0001f609' no such name
? u'\U0001f618' no such name
? u'\U0001f606' no such name
? u'\U0001f375' no such name
? u'\U0001f370' no such name

在 Python 3.X 中表现更好:

import unicodedata as ud
D = {b'\\xF0\\x9F\\x98\\xA2': 2, b'\\xF0\\x9F\\x98\\x82': 1, b'\\xF0\\x9F\\x98\\x86': 2, b'\\xF0\\x9F\\x98\\x89': 1, b'\\xF0\\x9F\\x8D\\xB5': 2, b'\\xF0\\x9F\\x8D\\xB0': 4, b'\\xF0\\x9F\\x8D\\xAB': 2, b'\\xF0\\x9F\\x8D\\xA9': 2, b'\\xF0\\x9F\\x98\\x98': 1, b'\\xE2\\x98\\xBA': 33, b'\\xE2\\x98\\x95': 1}
for k,v in D.items():
    k = k.decode('unicode-escape').encode('latin1').decode('utf8')
    try:
        n = ud.name(k)
    except ValueError:
        n = 'no such name'
    print(k,ascii(k),n)

输出(注意你的字体必须支持字符):

? '\U0001f618' FACE THROWING A KISS
? '\U0001f370' SHORTCAKE
? '\U0001f622' CRYING FACE
? '\U0001f36b' CHOCOLATE BAR
? '\U0001f375' TEACUP WITHOUT HANDLE
? '\U0001f369' DOUGHNUT
? '\U0001f602' FACE WITH TEARS OF JOY
? '\U0001f609' WINKING FACE
☕ '\u2615' HOT BEVERAGE
? '\U0001f606' SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES
☺ '\u263a' WHITE SMILING FACE

【讨论】:

  • 这是错误的。 Python 2 和 3 都可以打印非 bmp 字符,例如:print(u'\U0001f606') (?)。
  • @J.F.Sebastian,我在哪里说不能? 2.X 示例正在打印它们,但没有命名它们。
  • 这是错误的,因为 OP 应该修复任何产生 b'\\xF0\\x9F\\x98\\xA2' 而不是 u'\U0001f622' 的软件。在这种情况下甚至提到 BMP 都是不合适的——OP 不理解字节、Unicode 代码点及其在 Python 源代码中的表示之间的区别。如果你说 Python X.Y 使用 Unicode Z 版本,我会理解,因此 unicodedata 还不知道这样那样的字符(特别是一些表情符号),但无论如何你都可以使用它们。
猜你喜欢
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2013-03-02
  • 1970-01-01
  • 2014-09-08
  • 2013-08-20
相关资源
最近更新 更多