2015-07-07 23 views
8

У меня есть программа Python 2.7, которая читает текстовые сообщения iOS из базы данных SQLite. Текстовые сообщения являются строками unicode. В следующем текстовом сообщении:Python - Чтение символов Unicode от Emoji

u'that\u2019s \U0001f63b' 

Апостроф представлен \u2019, но смайлики представлены \U0001f63b. Я искал код для рассматриваемого emoji, и это \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 перед чтением, или есть более простой, менее глупый способ?

+0

'0xf63b' находится в разделе« Личное использование »Юникода. Вы уверены, что это правильно? Ваша кодовая точка, вероятно, '0x1f63b', так как это« улыбающаяся кошка с сердечными глазами »emoji. – Kupiakos

+0

Как вы определили, что '\ uf63b' будет символом Эмодзи? Согласно моей ссылке, она не определена: http://www.fileformat.info/info/unicode/char/f63b/index.htm –

ответ

17

Я не думаю, что вы правильно используете кодировку и не нуждаетесь. То, что у вас есть, является допустимой строкой unicode с одной четырехзначной и одной 8-разрядной escape-последовательностью. Попробуйте это в РЕПЛ, скажем, OS X

>>> 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] 
'' 
+0

Хорошо, я посмотрю на это ... Я ничего не знаю о ничего. Благодаря! Я все еще не понимаю, как читать только этот последний персонаж. s [-1] и s [-2] все еще дают '\ ud83d' и '\ ude3b'. Есть ли способ прочитать символ строки по символу? –

+1

@alaprise вы видите артефакт того, как Python хранит свои строки Unicode внутри. Если бы вы сделали то же самое в Python 3, вы бы увидели нечто совершенно иное. –

+2

@alaprise В другом ответе есть некоторая хорошая информация, из которой сводка «если возможно, переходите к Python3». В противном случае вы входите в мир боли/суррогатных пар/слов, которые вы не хотите знать, поскольку они являются песней Cthulhu – pvg

3

Ваша последняя часть путаницы, вероятно, связано с тем, что вы работаете, что называется " узкая сборка Python ". Python не может содержать ни одного символа с достаточной информацией для хранения одного эмози. Лучшим решением было бы перейти на Python 3. В противном случае попробуйте обработать UTF-16 surrogate pair.

+0

'regex.findall (r '\ X', unicode_text)' может использоваться для получения «воспринимаемых пользователем символов», которые могут охватывать более одного кода Unicode (он не имеет отношения к суррогатным парам, но он должен исправить проблему как сторона эффект). – jfs

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