我一直在使用Python中的TCP / IP连接程序,并且需要使用Struct。所以我导入了模块,并在一段时间后出现了一个非常特殊的问题。当我运行下面的代码时,我得到了te标题中指定的错误,这应该在我检查了一些其他答案和文档后工作。
import struct
string = "blab"
s = struct.Struct(b'4s')
packed_data = s.pack(string)
print(packed_data)
据我所知,问题应该通过将s变量中使用的字符串加上' b'来解决。或使用bytes()
函数解析' utf-8'作为编码参数。试过两个,同样的错误。
我不知道出了什么问题,所以我错过了什么?我在网上找不到有关此问题的相关信息,所以这就是我现在在这里发帖的原因。
任何帮助都表示赞赏,并提前致谢!
答案 0 :(得分:3)
最小的问题是你把" b"在错误的地方。当你要打包的数据真正需要是一个字节字符串时,你放入了格式字符串。
>>> string = "blab"
>>> s = struct.Struct('4s')
>>> packed_data = s.pack(string.encode('utf-8'))
>>> print(packed_data)
b'blab'
但即便如此也是有问题的。假设你的字符串不在ascii
字符集中......让我们说它的希腊语,那么utf8的enocded字符串超过4个字节并且你写了一个截断值
>>> string = "ΑΒΓΔ"
>>> s = struct.Struct('4s')
>>>
>>> packed_data = s.pack(string.encode('utf-8'))
>>> print('utf8len', len(string.encode('utf-8')), 'packedlen', len(packed_data))
utf8len 8 packedlen 4
>>> print(packed_data)
b'\xce\x91\xce\x92'
>>> print(struct.unpack('4s', packed_data)[0].decode('utf-8'))
ΑΒ
>>>
如果您确实需要限制为4个字节,请使用ascii
而不是utf-8
转换原始字符串,以便任何不可解码的unicode字符立即引发异常。
>>> string = "ΑΒΓΔ"
>>> s = struct.Struct('4s')
>>>
>>> packed_data = s.pack(string.encode('ascii'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
答案 1 :(得分:1)
packed_data = s.pack(string.encode('utf-8'))
应该同时适用于Py2和3
来自Unicode HowTo for Python 2.7.11:
另一个重要的方法是.encode([encoding],[errors ='strict']), 它返回编码的Unicode字符串的8位字符串版本 在请求的编码中。 errors参数与。相同 unicode()构造函数的参数,另外一个 可能性;以及'严格','忽略'和'替换',你可以 还传递'xmlcharrefreplace',它使用XML的字符引用。 以下示例显示了不同的结果: