UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte xx in position xx: invalid continuation byte

一、报错内容

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position xx: invalid continuation byte

二、报错翻译

Unicode解码错误: 'utf-8'编解码器无法解码位置(第38行)中的字节:因为这个字节是无效的延续字节
0xd6:0x开始能区分十六进制与十进制表达,这里是0xd6(十六进制)=6*1+13*16=214(十进制)=1101 0110(二进制),即本次无法解码:1101 0110

三、根源追溯

       在国际上,各个国家认可标准的ASCII编码,包含a-z、A-Z、0-9、常见键盘符等;在实际编程中,除了使用英文,我们也要使用本国的语言,于是各国产生了本国的ANSI编码,即在ASCII编码的基础上往前不断堆叠0和1,而ANSI编码在中国的规则是常见的gbk编码

       同样是二进制字节 1101 0110 ,gbk解码(我国ANSI编码)代表内容是和他国ANSI编码代表内容可以完全不一致,即我们常说的乱码问题。

       输入中文字符串时,在内存中是以unicode形式存储,我们也可以添加encoding参数指定以哪种编码方式存储,在win系统中,默认编码是ANSI编码,在简体中文的环境则为“gbk”,尤其一点,python的输出环境是默认为utf-8,即pandas库的to_csv默认结果为utf-8,而简体中文的excel遇到中文时是按gbk解码的,不加参数往往会遇到问题

因此,pandas库的to_csv往往添加参数  ,encoding=‘utf_8_sig’或者encoding=‘gbk’(‘ansi’)

补充编码解码的代码案例: 

s='中'  
print(ord(s))  #20013
'中'.encode('utf-8')   #b'\xe4\xb8\xad'
DATA = b'\xe4\xb8\xad'
DATA = str(DATA,'utf-8')
print(DATA)  #中

四、解决方案

(1)utf-8' codec can't decode byte 0xd6 in position xx: invalid continuation byte

在read_csv中添加:    encoding='ISO-8859-1'

import pandas as pd
Exposure_raw = pd.read_csv(r'D:\Program Files\Anaconda3\installation location\Lib\site-packages\addressparser\pca.csv', index_col=0,encoding='ISO-8859-1')

(2)'str' object has no attribute 'decode' (字符串对象没有编码属性)

--------->需对字符串先编码成二进制,再解码

'张俊'.encode('utf-8').decode('utf-8')

而且,如果是: '张俊'.encode('utf-8').decode('gbk') 结果与上面不同

五、参考网址

(1)解码错误解决方案

Python——报错 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 52: invalid continuation byte问题解决 - 小猪课堂 - 博客园这里介绍一个在read_csv()时报错的原因为:(加工字为位置可以任意) UnicodeDecodeError: 'utf-8' codec can't decode bythttps://www.cnblogs.com/huangchenggener/p/10983812.html

(2)编码根源解释

浅谈python3中的编码问题-数据小站在python3中,默认使用的是unicode编码。当我们输入中文字符时,在内存中是按照unicode编码存储,当需要写入硬盘时,会根据系统环境,自动按照gkb、utf8编码存储,减少存储开销。当然我们可以指定编码。http://www.51dtsc.cn/?p=884(3)代码小案例

Python >>> b'\xe6\x88\x91'类型编码转换为汉字_原谅我这一生不羁放纵爱自由-CSDN博客当接收到类似这样的一串东西的时候:b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'而我们需要将其转换为汉字进行显示。则我们只需要在代码中将其编码换成utf-8 即可:DATA = b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'DATA = str(DATA,'utf-8')print(DATA)输出结果:我爱你...https://blog.csdn.net/weixin_40973138/article/details/105593481(4)'str' object has no attribute 'decode'

AttributeError: ‘str‘ object has no attribute ‘decode‘解决方法_我爱柠檬博客-CSDN博客出现这个问题可能是两个原因造成的:1、Python2和Python3在字符串编码上的区别。2、Python 3.4: str : AttributeError: ‘str’ object has no attribute 'decode原因一的解决方法:print (‘张俊’.encode(‘utf-8’). decode(‘utf-8’) ) #必须将字节字符串解码后才能打印出来参考链接:https://www.cnblogs.com/geekard/archive/2012/10/04/pyhttps://blog.csdn.net/qq_43192819/article/details/108981008

---->方案1::先encode转为bytes,再decode
---->方案2:强制转换忽略错误:bytes.decode(‘’utf-8‘’, ‘’ignore‘’)

  • 45
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
根据您提供的引用内容,报错信息是"UnicodeDecodeError: ‘utf-8codec can’t decode byte 0xd1 in position 31: invalid continuation byte"。这个错误通常发生在尝试使用UTF-8编解码器解码一个无效的字节序列时。在这种情况下,字节序列中的第一个字节0xd1在给定的位置31处被认为是无效的连续字节。 根据您提供的其他引用内容,您的程序中还涉及到了gevent库的threadpool.py文件。这意味着问题可能与gevent库进行的一些字符设置相关。根据您提供的解决方案,问题可能是由于Windows 10环境中的某些更改导致的。您通过更改系统区域设置为使用Unicode UTF-8支持来解决了这个问题。 所以,为了解决 "utf-8' codec can't decode byte 0xd1 in position 31: invalid continuation byte" 的问题,您可以按照以下步骤进行操作: 1. 打开控制面板并点击 "语言"。 2. 在 "语言" 设置页面中,点击 "管理语言设置"。 3. 在 "区域设置" 选项卡中,点击 "更改系统区域设置"。 4. 在 "区域设置" 窗口中,选择 "使用 Unicode UTF-8 支持" 选项,并点击 "确定"。 5. 重新运行您的程序,检查是否还会出现相同的错误。 这样,您的程序应该能够正确解码UTF-8字符序列并避免 "utf-8' codec can't decode byte 0xd1 in position 31: invalid continuation byte" 错误的发生。 : 引用了UnicodeDecodeError: ‘utf-8codec can’t decode byte 0xd1 in position 31: invalid continuation byte : 引用了gevent库的threadpool.py文件和更改系统区域设置为使用Unicode UTF-8支持的解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值