82

这是一个 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 字符变成 gobbledegook。

4

4 回答 4

119

上述代码示例中的“mangler”正在执行与此等效的操作:

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

还有其他方法可以写这个(特别是使用bytes(stringThing, encoding='UTF-8'),但上面的语法很明显发生了什么,以及如何恢复字符串:

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

当我们这样做时,原始字符串被恢复。

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

于 2012-12-23T11:22:01.973 回答
17

在 python3 中,有一个bytes()方法与encode().

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

我没有在文档中读到任何关于此的内容,但也许我没有找对地方。encode通过这种方式,您可以显式地将字符串转换为字节流,并且比使用and更具可读性decode,并且不必b在引号前加上前缀。

于 2014-05-22T19:03:22.127 回答
5

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

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


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

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

可悲的是,有很多情况下字节序列用于表示文本,但不一定明确定义正在使用的编码。以类 unix 系统上的文件名为例,就内核而言,它们是具有少量特殊值的字节序列,在大多数现代发行版上,大多数文件名将是 UTF-8,但不能保证所有文件名都会是。

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

打印(字节事物)

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

于 2018-05-10T14:07:11.077 回答
3

试试这个:

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

测试类型:

print(type(StringVariable))

这里 'StringVariable' 表示为一个字符串。'ByteVariable' 表示为字节。它与质疑变量无关..

于 2017-09-29T17:31:37.460 回答