Кодек «UCS-2» не может кодировать символы в позиции 1050-1050

Когда я запускаю свой код Python, я получаю следующие ошибки:

  File "E:\python343\crawler.py", line 31, in <module>
    print (x1)
  File "E:\python343\lib\idlelib\PyShell.py", line 1347, in write
    return self.shell.write(s, self.tags)
UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 1050-1050: Non-BMP character not supported in Tk

Вот мой код:

x = g.request('search', {'q' : 'TaylorSwift', 'type' : 'page', 'limit' : 100})['data'][0]['id']

# GET ALL STATUS POST ON PARTICULAR PAGE(X=PAGE ID)
for x1 in g.get_connections(x, 'feed')['data']:
    print (x1)
    for x2 in x1:
        print (x2)
        if(x2[1]=='status'):
            x2['message']

Как я могу это исправить?


person Andi    schedule 07.09.2015    source источник
comment
если вам нужно увидеть символы Unicode, отличные от bmp; вы можете запускать python в интерактивном режиме в среде, которая может их отображать, например, в консоли ConEmu или веб-браузере. Попробуйте блокнот ipython.   -  person jfs    schedule 07.09.2015


Ответы (3)


Ваши данные содержат символы, не входящие в Базовый многоязычный уровень. Например, эмодзи находятся за пределами BMP, а оконная система, используемая IDLE, Tk, не может обрабатывать такие символы.

Вы можете использовать таблицу перевода, чтобы сопоставить все, что находится за пределами BMP в замещающий символ:

import sys
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)
print(x.translate(non_bmp_map))

non_bmp_map сопоставляет все кодовые точки за пределами BMP (любая кодовая точка выше 0xFFFF, вплоть до наибольшая кодовая точка Unicode, которую может обрабатывать ваша версия Python) на U+FFFD ЗАМЕНА СИМВОЛА:

>>> print('This works outside IDLE! \U0001F44D')
This works outside IDLE! ????
>>> print('This works in IDLE too! \U0001F44D'.translate(non_bmp_map))
This works in IDLE too! �
person Martijn Pieters    schedule 07.09.2015
comment
Спасибо, но после их добавления появляется новая ошибка: print (x1.translate(non_bmp_map)) AttributeError: у объекта 'dict' нет атрибута 'translate', так как это сделать?? - person Andi; 07.09.2015
comment
@Andi: x1 - это не строка, а словарь. Вы могли бы сделать str(x1).translate(non_bmp_map) в этом случае. - person Martijn Pieters; 07.09.2015

Ни один из них не работал для меня, но следующее работает. Это предполагает, что public_tweets был взят из tweepy api.search.

for tweet in public_tweets:
    print (tweet.text)
    u=tweet.text
    u=u.encode('unicode-escape').decode('utf-8')
person Keith Student    schedule 02.12.2018

эта проблема с юникодом наблюдалась в python 3.6 и более ранних версиях, чтобы решить ее, просто обновите python до python 3.8 и используйте свой код. Эта ошибка не появится.

person Parika Pandey    schedule 19.10.2019
comment
Я рад проголосовать за ваш ответ, потому что 1) я нахожу его очень полезным, 2) я самый первый, кто проголосовал за вас, чтобы приветствовать вас в stackoverflow. - person eyquem; 21.10.2019