做python的struct读取二进制编码中,遇到编码错误提醒
!!!重点针对于对【汉字解码】解决方法。
问题描述
首先写入二进制编码
import struct
a = 100
b = "哈哈哈哈" #我们参用的是字符型(注意不是英文字符)
s = 'zxczxc'
c = True
sn = struct.pack('i?',a,c) #序列化 i:整形,?:逻辑值 f:实型
with open(r"C:UsersLenovoDesktop哈哈.kpl",'wb') as f:
f.write(sn)
f.write(b.encode()) #对字符串进行编码写入
strcut读写二进制文件源代码
import struct
with open(r'C:UsersLenovoDesktop哈哈.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:数据意外结束说明是编译字符串期间出现问题停止解码。
我们可以设置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属性也可以,只不过较为不实用。 当然我写这是为了帮助小白避坑,就比如我写的第二个方法,我是参考其他大佬而解决的,我觉得非常不实用,所以还是要多分析自己代码才能解决根本问题。修改过后,我们发现有输出值了,但也确实输出不完全



