在 Python3中如何在字节和字符串之间进行转换?

这是一个 Python 101类型的问题,但当我试图使用一个似乎可以将字符串输入转换为字节的包时,它让我困惑了一段时间。

正如你将在下面看到的,我为自己找到了答案,但我觉得这是值得记录在这里,因为它花费了我的时间去发掘什么是正在发生的。它似乎是 Python 3的通用程序,所以我没有提到我正在使用的原始包; 它似乎不是一个错误(只是特定的包有一个 .tostring()方法,显然是 没有生成我所理解的字符串...)

我的测试程序是这样的:

import mangler                                 # spoof package


stringThing = """
<Doc>
<Greeting>Hello World</Greeting>
<Greeting>你好</Greeting>
</Doc>
"""


# print out the input
print('This is the string input:')
print(stringThing)


# now make the string into bytes
bytesThing = mangler.tostring(stringThing)    # pseudo-code again


# now print it out
print('\nThis is the bytes output:')
print(bytesThing)

这段代码的输出如下:

This is the string input:


<Doc>
<Greeting>Hello World</Greeting>
<Greeting>你好</Greeting>
</Doc>




This is the bytes output:
b'\n<Doc>\n    <Greeting>Hello World</Greeting>\n    <Greeting>\xe4\xbd\xa0\xe5\xa5\xbd</Greeting>\n</Doc>\n'

因此,需要能够在字节和字符串之间进行转换,以避免最终将非 ascii 字符转换成冗长的文字。

193040 次浏览

上面代码示例中的“碾压器”正在做类似的事情:

bytesThing = stringThing.encode(encoding='UTF-8')

还有其他写入方法(特别是使用 bytes(stringThing, encoding='UTF-8'),但是上面的语法可以清楚地看到正在发生什么,以及如何恢复字符串:

newStringThing = bytesThing.decode(encoding='UTF-8')

执行此操作时,将恢复原始字符串。

注意,使用 str(bytesThing)只是抄写所有的官样文章,而不会将其转换回 Unicode,除非您特别请求 UTF-8,即 str(bytesThing, encoding='UTF-8')。如果未指定编码,则不报告任何错误。

在 python3中,有一个与 encode()格式相同的 bytes()方法。

str1 = b'hello world'
str2 = bytes("hello world", encoding="UTF-8")
print(str1 == str2) # Returns True

我在文件里没有看到任何关于这个的东西,但也许我没有找对地方。通过这种方式,您可以显式地将字符串转换为字节流,并使其比使用 encodedecode更具可读性,而且不必在引号前面加上 b前缀。

试试这个:

StringVariable=ByteVariable.decode('UTF-8','ignore')

测试类型:

print(type(StringVariable))

在这里‘ StringVariable’表示为字符串。‘ ByteVariable’表示为 Byte。它与问题变量无关。

这是一个 Python 101类型的问题,

这是一个简单的问题,但答案却不那么简单。


在 python3中,“ byte”对象表示一个字节序列,“ string”对象表示一个 unicode 代码点序列。

要在从“ byte”到“ string”和从“ string”到“ bytes”之间进行转换,可以使用 bytes.decode 和 string.encode 函数。这些函数采用两个参数,一个编码和一个错误处理策略。

遗憾的是,在很多情况下,字节序列被用来表示文本,但是并不一定能很好地定义所使用的编码方式。以类 Unix 系统上的文件名为例,就内核而言,它们是带有少量特殊值的字节序列,在大多数现代发行版中,大多数文件名将是 UTF-8,但不能保证所有文件名都是 UTF-8。

如果您想编写健壮的软件,那么您需要仔细考虑这些参数。您需要仔细考虑字节应该在什么编码中,以及如何处理这种情况,即它们不是您认为应该在其中的编码的有效字节序列。Python 默认为 UTF-8,并且在无效 UTF-8的任何字节序列上出错。

打印(字节)

Python 使用“ repr”作为字符串的后备转换。Repr 尝试生成将重新创建对象的 python 代码。在字节对象的情况下,这意味着在可打印的 ascii 范围之外转义字节。