python中struct错误分析:SyntaxError: Non-UTF-8 code starting with ‘\xfe‘ in file与UnicodeDecodeError报错。

项目场景:

做python的struct读取二进制编码中,遇到编码错误提醒
!!!重点针对于对【汉字解码】解决方法。

报错如下:
在这里插入图片描述

问题描述

首先写入二进制编码

import struct
a = 100
b = "哈哈哈哈"	#我们参用的是字符型(注意不是英文字符)
s = 'zxczxc'
c = True
sn = struct.pack('i?',a,c)	#序列化	i:整形,?:逻辑值 f:实型   
with open(r"C:\Users\Lenovo\Desktop\哈哈.kpl",'wb') as f:
	f.write(sn)
	f.write(b.encode())		#对字符串进行编码写入

strcut读写二进制文件源代码

import struct
with open(r'C:\Users\Lenovo\Desktop\哈哈.kpl', 'rb') as f:
	sn = f.read(5)
	n,x = struct.unpack('i?', sn)		#使用指定格式反序列化
	print('n=', n, 'x=', x)
	s = f.read(4).decode()   
	print('s=',s)
	}

结果报错, 首先是百度寻找问题的解决方法,但是参考了大多数人的分析均没有确定的解决方案


原因分析与解决方案:

第一个错误:

报错引文翻译大致为:没有utf-8编译器编译。
首先确定首先是文件格式不对,而我正好看到编译器为UTF-16BE,更改文件为UTF-8译码器


在这里插入图片描述

第二个错误:

如下图,更改过后我们运行一下发现没有提示上一错误,而且②有两个值也显示了出来,说明编码器可以正常编码。
在这里插入图片描述

错误①代码:UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position
①的分析:UnicodeDecodeError:'utf-8'编解码器无法解码位置 3 中的字节0xe5:数据意外结束说明是编译字符串期间出现问题停止解码。

解决方式1:

我们可以设置read后括号值大于字符串所对应字节数即可,如下:

	s = f.read(12).decode()

因为字符串为四个汉字,而我们采用UTF-8编码,UTF-8'中汉字为3个字节,而英文字符为1个字节,所以这里的字应为12个字节。所以当读取的字节不合法,就会报出上述UnicodeDecodeError错误。

解决方式2:

参考大佬的分析:参考地址,这种方式是【强制编码】,它改变了decode()的属性,把能编译出来的输出,剩余字节若不大于等于对应字的字节长度则放置,但不报错,唯一bug是输出不全。

我们所说的属性指:decode()方法的第二个参数errors为严格(strict)形式,因为默认就是这个参数,将其更改为ignore等即可。

修改过后,我们发现有输出值了,但也确实输出不完全
在这里插入图片描述

总结:

在我看来,其实UnicodeDecodeError报错并没有问题。问题在于你如何设置读取的字节数,当你设置读取字节数不合法,python会提醒你不能继续解码并报错,然后你只需修改读取字节数即可。当然在如果是你输入字符串为英文字符,就不用太在意报错问题,因为每个字节都为1,如果设置少了也只是解码的字少而已,不像中文字符这样。
当然,设置decode属性也可以,只不过较为不实用。
注:我写这篇文章为了帮助小白避坑,就比如我写的第二个方法,我是参考其他大佬而解决的,我觉得非常不实用,所以还是要多分析自己代码才能解决根本问题。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值