Python 将字节转换为字符串
Python converting bytes to string
我有以下代码:
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"
有谁知道为什么会这样吗?
这里发生了一些事情。
PNG file format 可以包含以 Latin-1 或 UTF-8 编码的文本块。 tEXt
块以 Latin-1 编码,您需要使用 'latin-1'
编解码器对其进行解码。 iTXt
块以 UTF-8 编码,需要使用 'utf-8'
编解码器进行解码。
但是,您似乎在尝试解码单个字节,而 UTF-8 中的字符可能跨越多个字节。所以假设你想读取 UTF-8 字符串,你应该做的是在尝试解码之前读入你想要解码的字符串的整个长度。
如果您尝试从文件中解释二进制数据,请查看专用于该目的的 struct
模块。
我有以下代码:
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"
有谁知道为什么会这样吗?
这里发生了一些事情。
PNG file format 可以包含以 Latin-1 或 UTF-8 编码的文本块。 tEXt
块以 Latin-1 编码,您需要使用 'latin-1'
编解码器对其进行解码。 iTXt
块以 UTF-8 编码,需要使用 'utf-8'
编解码器进行解码。
但是,您似乎在尝试解码单个字节,而 UTF-8 中的字符可能跨越多个字节。所以假设你想读取 UTF-8 字符串,你应该做的是在尝试解码之前读入你想要解码的字符串的整个长度。
如果您尝试从文件中解释二进制数据,请查看专用于该目的的 struct
模块。