Emoji, кодировать / декодировать, когда текстовый файл содержит utf-8 и utf-16 - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть текстовый файл, который содержит это:

....     
{"emojiCharts":{"emoji_icon":"\u2697","repost": 3, "doc": 3, "engagement": 1184, "reach": 6734, "impression": 44898}}
{"emojiCharts":{"emoji_icon":"\U0001f924","repost": 11, "doc": 11, "engagement": 83, "reach": 1047, "impression": 6981}}
....

некоторые из смайликов в формате \uhhhh, некоторые из них в формате \Uhhhhhhhh.

Существует ли какой-либо способ кодировать / декодировать его для отображения смайликов? Потому что если файл содержит ТОЛЬКО \Uhhhhhhhh, то все работает нормально.

Чтобы перейти на этот этап, я изменил файл следующим образом:

insightData.decode("raw_unicode_escape").encode('utf-16', 'surrogatepass').decode('utf-16').encode("raw_unicode_escape").decode("latin_1")

Для отображения смайликов мне нужно использовать это:

insightData.decode("raw_unicode_escape").encode('utf-16', 'surrogatepass').decode('utf-16')

НО выдает ошибку:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2600' in position 30: ordinal not in range(128)

РЕШЕНИЕ:

with open(OUTPUT, "r") as infileInsight:
    insightData = infileInsight.read()\
    .decode('raw_unicode_escape')

with open(OUTPUT, "w+") as outfileInsight:
    outfileInsight.write(insightData.encode('utf-8'))

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Это не имеет ничего общего с UTF-8 или UTF-16. Это всего лишь способ Python для экранирования символов Unicode в целом: все, что ниже U + FFFF, использует \uFFFF, а все, что выше, - \UFFFFFFFF (по историческим причинам).

Обе escape-последовательности должны работать одинаково в строке Python. На моей машине, используя решение @ vks:

$ python
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> '\U0000ABCD'.decode('unicode-escape')
u'\uabcd'
>>> '\uABCD'.decode('unicode-escape')
u'\uabcd'

и аналогичные для Python 3.

0 голосов
/ 06 сентября 2018

OK. Python 2.7, Win 10.

Ваш исходный файл представляет собой обычный ASCII, содержащий точные экранированные символы Юникода ("\ u ####", 6 байтов и "\ U ########", 10 байтов).

Считайте файл и декодируйте, используя 'unicode-escape': тогда у вас есть строка Unicode в Python; давайте назовем это your_unicode_string.

Чтобы написать файл, выберите:

output_encoding = 'utf-8'

или

output_encoding = 'utf-16-le'

, а затем:

import codecs
with codecs.open(output_filename, 'w', encoding=output_encoding) as fpo:
    # fpo.write(u'\ufeff') # for windows, you might want to write this at the start
    fpo.write(your_unicode_string)

Для данной версии Python и OS без вмешательства вы не сможете просто print подойти к консоли и увидеть смайлики.

0 голосов
/ 06 сентября 2018

Вы можете просто сделать это.

print a["emojiCharts"]["emoji_icon"].decode("unicode-escape")

Выход:

...