python 3.3:struct.pack不接受字符串

时间:2013-06-20 15:58:21

标签: python python-3.x

我正在尝试使用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转换代码对字节对象进行操作,但使用此类代码打包也支持使用UTF-8编码的str对象。”

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

2 个答案:

答案 0 :(得分:10)

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

结论是隐式转换是一个坏主意,并且在开发人员仍有机会这样做的情况下还原了:

  

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

这也记录在porting section of the 3.2 What's New guide

  

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

您需要在打包前对字符串进行显式编码。

答案 1 :(得分:2)

我可能错了,但在这种情况下.encode('UTF-8')不会有效吗? 例如:

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

我有待纠正。