2015-06-02 3 views
1

У меня есть список, в котором есть смайлики WhatsApp, закодированные как символы utf-8. Таблица, которую я использую для декодирования смайликов, находится в http://apps.timwhitlock.info/emoji/tables/unicodeКак отобразить/преобразовать строку utf-8 в соответствующий символ

С этой таблицей я пытаюсь подсчитать количество используемых смайликов, которые я успешно выполнил с помощью методов регулярных выражений. Проблема в том, что я создал словарь, в котором ключи являются символами 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.

+0

Вы используете шрифт со всеми глифами для смайликов? –

+0

@RobbyCornelissen Да. Когда я читаю в исходном текстовом файле с помощью * .readlines() и print *, он отображает соответствующие смайлики – superhero

+0

, каков ваш ввод (показать 'print repr (your_input)')? То, что показано в вашем вопросе, - это не данные utf-8. – jfs

ответ

1

Это будет правильно декодировать символы Unicode, но в Python 2.X вы несколько ограничены при использовании символов вне BMP (Basic Multilingual Plane, символы 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) 

Output (п oте ваш шрифт должен поддерживать символы):

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

Смежные вопросы