9

我正在尝试使用 struct.pack 将填充字符串写入文件,但对于 3.x 解释器,这似乎不再起作用。我如何使用它的一个例子:

mystring = anotherString+" sometext here"
output = struct.pack("30s", mystring);

这在早期版本的 python 中似乎没问题,但是在 3 中它会产生一个需要字节对象的错误。文档似乎暗示它应该毫无怨言地将任何字符串转换为 UTF-8 字节对象(我不在乎多字节字符是否被截断):

http://docs.python.org/release/3.1.5/library/struct.html“c、s 和 p 转换代码对字节对象进行操作,但使用此类代码打包也支持 str 对象,这些对象使用编码UTF-8。”

我是否误读了文档以及其他人如何使用带有字符串的 struct.pack?

4

2 回答 2

11

是的,直到 3.1struct.pack()错误地将字符串隐式编码为 UTF-8 字节;这已在 Python 3.2 中修复。见问题 10783

结论是隐式转换是一个坏主意,并且在开发人员仍有机会这样做时将其恢复:

我现在更喜欢破坏 API,而不是不得不维护一个破损的 API 10 或 20 年 :-) 我们使用 Python 3 的用户群非常小,现在更改它比在下一个版本中更容易。

这也记录在3.2 What's New 指南的移植部分

struct.pack()现在只允许s字符串包代码的字节。以前,它会接受文本参数并使用 UTF-8 将它们隐式编码为字节。这是有问题的,因为它假设了正确的编码,并且在写入结构的固定长度段时,可变长度编码可能会失败。

您需要在打包之前明确编码您的字符串。

于 2013-06-20T16:04:12.700 回答
3

我可能是错的,但在这种情况下.encode('UTF-8')不起作用?例如:

output = struct.pack("30s", mystring.encode('UTF-8'));

我接受纠正。

于 2016-09-13T12:58:39.027 回答