【问题标题】:'UCS-2' codec can't encode characters in position 61-61“UCS-2”编解码器无法对位置 61-61 中的字符进行编码
【发布时间】:2018-01-24 16:45:36
【问题描述】:

当我运行 Python 代码并打印(项目)时,我收到以下错误:

UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 61-61: Non-BMP character not supported in Tk

这是我的代码:

def getUserFollowers(self, usernameId, maxid = ''):
    if maxid == '':
        return self.SendRequest('friendships/'+ str(usernameId) +'/followers/?rank_token='+ self.rank_token,l=2)
    else:
        return self.SendRequest('friendships/'+ str(usernameId) +'/followers/?rank_token='+ self.rank_token + '&max_id='+ str(maxid))
def getTotalFollowers(self,usernameId):
    followers = []
    next_max_id = ''
    while 1:
        self.getUserFollowers(usernameId,next_max_id)
        temp = self.LastJson

        for item in temp["users"]:
            print(item)
            followers.append(item)

        if temp["big_list"] == False:
            return followers            
        next_max_id = temp["next_max_id"]

我该如何解决这个问题?

【问题讨论】:

  • 错误发生在哪一行,followers是什么,temp["users"]是什么?
  • followers 是一个列表,temp 是 josn 加载的内容 where self.LastJson = json.loads(response.text).

标签: python json unicode encode


【解决方案1】:

在不知道temp["users"] 的内容的情况下很难猜到,但错误表明它包含非 BMP unicode 字符,例如 emoji

如果您尝试在 IDLE 中显示它,您会立即收到此类错误。重现的简单示例(在 Python 3.5 的 IDLE 上):

>>> t = "ab \U0001F600 cd"
>>> print(t)
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    print(t)
UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 3-3: Non-BMP character not supported in Tk

(\U0001F600代表unicode字符U+1F600笑脸)

该错误确实是由于 Tk 不支持 code 大于 FFFF 的 unicode 字符引起的。一个简单的解决方法是将它们从您的字符串中过滤出来:

def BMP(s):
    return "".join((i if ord(i) < 10000 else '\ufffd' for i in s))

'\ufffd' 是 unicode U+FFFD REPLACEMENT CHARACTER 的 Python 表示。

我的例子变成:

>>> t = "ab \U0001F600 cd"
>>> print(BMP(t))
ab � cd

所以你的代码会变成:

for item in temp["users"]:
    print(BMP(item))
    followers.append(item)

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 2020-01-13
    • 2023-03-03
    • 2018-11-12
    • 2018-12-12
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多