将零填充字节转换为UTF-8字符串

Mat*_*ner 18 python unicode byte utf-8 strncpy

我正在压缩包含's'来自C的类型字段的几个结构.字段包含strncpy在C代码中处理的零填充UTF-8字符串(注意此函数的残留行为).如果我解码字节,我会得到一个包含大量NUL字符的unicode字符串.

>>> b'hiya\0\0\0'.decode('utf8')
'hiya\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)

我的印象是尾随零字节是UTF-8的一部分,并会自动删除.

删除零字节的正确方法是什么?

Ada*_*eld 21

使用str.rstrip()删除后完全无效:

>>> 'hiya\0\0\0'.rstrip('\0')
'hiya'
Run Code Online (Sandbox Code Playgroud)


Dun*_*can 18

无论rstrip或者replace如果字符串被填充到用null缓冲区结束才有效.实际上,缓冲区可能尚未初始化为null,因此您可能会得到类似的结果b'hiya\0x\0'.

如果你断然100%知道C代码以空初始化缓冲区开始并且永远不会重复使用它,那么你可能会发现rstrip更简单,否则我会选择稍微麻烦但更安全:

>>> b'hiya\0x\0'.split(b'\0',1)[0]
b'hiya'
Run Code Online (Sandbox Code Playgroud)

将第一个null视为终止符.

  • 我会建议`b'hiya\0x\0'.partition(b'\ 0')[0]`. (4认同)