Почему некоторые смайлики не превращаются обратно в свое представление? - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над модулем обнаружения смайликов. Для некоторых смайликов я наблюдаю странное поведение, которое заключается в том, что после преобразования их в кодировку utf-8 они не преобразуются обратно в исходную форму представления. Мне нужно, чтобы их точное цветное представление было отправлено как ответ API вместо отправки строки с экранированием Юникода. Любые лиды?

In [1]: x = "example1: ? and example2: ? and example3: ?" 

In [2]: x.encode('utf8')                                                                                                                                                                                                          
Out[2]: b'example1: \xf0\x9f\xa4\xad and example2: \xf0\x9f\x98\x81 and example3: \xf0\x9f\xa5\xba'

In [3]: x.encode('utf8').decode('utf8')                                                                                                                                                                                           
Out[3]: 'example1: \U0001f92d and example2: ? and example3: \U0001f97a'

In [4]: print( x.encode('utf8').decode('utf8')  )                                                                                                                                                                                 
*example1: ? and example2: ? and example3: ?*

Ссылка Emoji, использованная в примере

Обновление 1: В этом примере объяснение должно быть намного понятнее. Здесь отображаются два смайлика, когда я отправляю escape-строку в юникоде, но третий пример не смог преобразовать точный смайлик, что делать в таком случае?

API View Code API Response using Postman

1 Ответ

3 голосов
/ 30 апреля 2020

'\U0001f92d' == '?' - это True. Это escape-код, но все тот же символ ... Два способа отображения / ввода. Первая - это repr() строки, печатающая звонки str(). Пример:

>>> s = '?'
>>> print(repr(s))
'\U0001f92d'
>>> print(str())
?
>>> s
'\U0001f92d'
>>> print(s)
?

Когда Python генерирует repr (), он использует представление escape-кода, если считает, что дисплей не может обработать символ. Содержимое строки остается тем же ... кодовая точка Unicode.

Это функция отладки. Например, это пробелы или табуляции? repr() строки проясняет это, используя \t в качестве кода перехода.

>>> s = 'a\tb'
>>> print(s)
a       b
>>> s
'a\tb'

Относительно того, почему код перехода используется для одного смайлика, а не для другого, это зависит от версии Юникод поддерживается используемой версией Python.

Pyton 3.8 использует Юникод 9.0, и один из ваших смайликов не определен на этом уровне версии:

>>> import unicodedata as ud
>>> ud.unidata_version
'9.0.0'
>>> ud.name('?')
'GRINNING FACE WITH SMILING EYES'
>>> ud.name('?')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: no such name
...