Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
368 views
in Technique[技术] by (71.8m points)

pytho3中编码问题报错'utf-8' codec can't decode byte 0xdc in position 1

def decrypts(self, encryptedData, iv):
    new_sessionKey = base64.b64decode(self.sessionKey)
    new_encryptedData = base64.b64decode(encryptedData)
    new_iv = base64.b64decode(iv)
    cipher = AES.new(new_sessionKey, AES.MODE_CBC, new_iv)

    decrypted = json.loads(self._unpad(cipher.decrypt(new_encryptedData)).decode)  # 会出现"utf-8"错误
    if decrypted['watermark']['appid'] != self.appId:
        raise Exception('Invalid Buffer')
    return decrypted

def _unpad(self, s):
    return s[:-ord(s[len(s)-1:])]
解码微信登录获取手机号时报错,有时又正常,要如何写

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

可能有两个原因:

  1. 你的数据编码不是 utf8 ;
  2. 你处理数据时,破坏了数据的完整性;

第一个原因就不说,你换成正确的编码即可。

第二个原因举个例子,对于合法的UTF8编码文本,可以成功解码:

>>> data = '中国'.encode('utf8')
>>> data.decode('utf8')
'中国'

如果因为某种原因,UTF8文本少了一个字节或者某个字节错掉了,解码时就会抛锚:

>>> data[1:].decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte

这时,你可以选择在解码中忽略错误:

>>> data[1:].decode('utf8', errors='ignore')
'国'

或者将不可识别的字符替换成一个问号,以便定位UTF8字节流问题位置:

>>> data[1:].decode('utf8', errors='replace')
'??国'

更多关于文本编码的细节介绍,可以参考我先前写的文章:一文说清文本编码那些事


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...