python - 如何将 utf-8 字符串显示/转换为正确的符号

标签 python unicode encoding utf-8

我有一个列表,其中包含编码为 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 中的内容。

最佳答案

这将正确解码 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 - 如何将 utf-8 字符串显示/转换为正确的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30587359/

相关文章:

python - 使用完整路径运行脚本

Ruby:如何将潜在的 unicode 字符串分解为字节

java - 未记录的 Java 正则表达式字符类 :\p{C}

C# HtmlAgilityPack HtmlDocument() LoadHtml编码

python - 安装和导入后,colaboratory 将不承认 arviz

python - 推特数据挖掘 : Degrees of separation

python - 在python中包含带有特殊字符的图例标签上的变量

通过 chromebook 终端访问的远程机器上的 MySQL 返回无意义的 unicode,它在我离开 MySQL 后仍然存在

sqlite - 将 AIR 应用程序中的 SQLite 数据库编码更改为 UTF-8

Java InputStream 编码/字符集