“UCS-2”编解码器无法编码第1050个字符的位置。

11
当我运行我的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']

我该怎么解决这个问题?

1
如果您需要查看非BMP Unicode字符,则可以在支持它们的环境中交互地运行Python,例如在ConEmu控制台或Web浏览器中。尝试使用ipython notebook - jfs
3个回答

31
你的数据包含基本多文种平面之外的字符。例如,表情符号就在BMP之外,而IDLE、Tk使用的窗口系统无法处理这些字符。
你可以使用翻译表将BMP之外的所有内容映射到替换字符上:
import sys
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)
print(x.translate(non_bmp_map))

非BMP映射表non_bmp_map将所有BMP之外的码位(任何高于0xFFFF的码位,一直到您的Python版本可以处理的最高Unicode码位)映射为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!

1
谢谢,但是添加这些后,出现了新的错误:print(x1.translate(non_bmp_map)) AttributeError: 'dict' object has no attribute 'translate',那么该怎么办呢? - Andi
3
@Andi说:"x1" 不是一个字符串,而是一个字典。在这种情况下,你可以使用 str(x1).translate(non_bmp_map) - Martijn Pieters

4

在Python 3.6及以下版本中存在此Unicode问题,只需升级到Python 3.8并使用您的代码即可解决此问题。这样错误就不会再出现了。


1
我很高兴给你的回答点赞,因为1)我发现它非常有用,2)我是第一个在stackoverflow上欢迎你的人。 - eyquem

4

这些方法都没有对我起作用,但以下方法有效。假设public_tweets是从tweepy api.search获取的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接