项目场景:
做python的struct读取二进制编码中,遇到编码错误提醒
!!!重点针对于对【汉字解码】解决方法。
报错如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f2b6060f06a34672a2155614cd61f2ff.png#pic_center)
问题描述
首先写入二进制编码
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等即可。
修改过后,我们发现有输出值了,但也确实输出不完全