栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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: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:数据意外结束说明是编译字符串期间出现问题停止解码。

解决方式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属性也可以,只不过较为不实用。 当然我写这是为了帮助小白避坑,就比如我写的第二个方法,我是参考其他大佬而解决的,我觉得非常不实用,所以还是要多分析自己代码才能解决根本问题。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920408.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号