Python将字节转换为字符串

4
我有以下代码:
with open("heart.png", "rb") as f:

    byte = f.read(1)

    while byte:

        byte = f.read(1)

        strb = byte.decode("utf-8", "ignore")

        print(strb)

当从“heart.png”读取字节时,我必须读取十六进制字节,例如:

b'öx1a', b'öxff', b'öxa4', etc.

并且以这种形式表示字节:

b'A', b'D', b'O', b'D', b'E', etc.    <- spells ADOBE

现在有一个问题,当我使用上面的代码将字节转换为字符串时,似乎无法处理十六进制形式的字节,但对于其他所有内容都有效。所以当出现b'öx1a'时,它会将其转换为空字符串,而当出现b'H'时,它会将其转换为"H"。有人知道为什么会这样吗?

你不能有包含非ASCII字符的字节,b'öxff'等是从哪里来的? - Padraic Cunningham
@PadraicCunningham 我认为他的意思是 b'\xff' 等等。 - augurar
1
如果你想要解码,你需要使用正确的编解码器。b'\xa4'.decode("iso-8859-15") 将会是 '€' 或者使用 latin-1 则为 '¤' - Padraic Cunningham
1个回答

4

这里有几件事情需要注意。

PNG文件格式可以包含使用Latin-1或UTF-8编码的文本块。 tEXt 块使用Latin-1编码,您需要使用 'latin-1' 编解码。 iTXt 块使用UTF-8编码,需要使用 'utf-8' 编解码。

然而,您似乎正在尝试解码单个字节,而UTF-8中的字符可能跨越多个字节。 因此,假设您想要读取UTF-8字符串,您应该在尝试解码之前读取整个字符串的长度。

如果您尝试解释文件中的二进制数据,请查看 struct 模块,该模块专门用于此目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接