2015-06-02 35 views
1

我有一個列表,其中包含以UTF-8字符編碼的WhatsApp表情符號。我用來解碼錶情符號的表格位於http://apps.timwhitlock.info/emoji/tables/unicode如何將utf-8字符串顯示/轉換爲正確的符號

有了這張表格,我正在計算使用正則表達式的表情符號的數量,我已經成功地使用了正則表達式技術。問題是我創建了一個字典,其中的鍵是UTF-8字符作爲字符串,而key_values是整數。下面:如果我用這個代碼

{'\\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 

我應該得到笑臉和

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

,輸出結果類似。有什麼建議麼?這是在Python 2.7中。

+0

你是否在使用一個包含表情圖標所有字形的字體? –

+0

@RobbyCornelissen是的。當我使用* .readlines()和print *來讀取原始文本文件時,它會顯示正確的表情 – superhero

+0

輸入是什麼(顯示'print repr(your_input)')?你的問題顯示的不是utf-8數據。 – jfs

回答

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 
+1

這是錯誤的。 Python 2和Python 3都可以打印非bmp字符,例如:print(u'\ U0001f606')'()。 – jfs

+0

@ J.F.Sebastian,我說它不能做什麼? 2.X示例正在打印它們,但未命名它們。 –

+0

這是錯誤的,因爲OP應該修復產生'b'\\ xF0 \\ x9F \\ x98 \\ xA2''而不是'u'\ U0001f622''的軟件。在這種情況下甚至不提及BMP - OP不理解字節,Unicode代碼點及其在Python源代碼中的表示之間的差異。如果你說Python X.Y使用Unicode Z版本,並且因此不知道「unicodedata」還有那些和那些字符(特別是一些表情符號),但是您仍然可以使用它們,我會理解。 – jfs

相關問題