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

时间:2011-02-22 04:36:18

标签: python unicode utf-8 byte strncpy

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

>>> b'hiya\0\0\0'.decode('utf8')
'hiya\x00\x00\x00'

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

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

4 个答案:

答案 0 :(得分:19)

使用str.rstrip()删除尾随的NUL:

>>> 'hiya\0\0\0'.rstrip('\0')
'hiya'

答案 1 :(得分:17)

rstripreplace只有在字符串填充到缓冲区末尾时才会起作用。实际上,缓冲区可能尚未初始化为null,因此您可能会得到类似b'hiya\0x\0'的内容。

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

>>> b'hiya\0x\0'.split(b'\0',1)[0]
b'hiya'

将第一个null视为终止符。

答案 2 :(得分:3)

与分割/分区解决方案不同,这不会复制多个字符串,对于长字节数组可能更快。

data = b'hiya\0\0\0'
i = data.find(b'\x00')
if i == -1:
  return data
return data[:i]

答案 3 :(得分:1)

也许您可以致电.replace('\0', '')并清理它们?