这是一个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。
答案 0 :(得分:98)
上面代码示例中的'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')
。如果未指定编码,则不会报告错误。
答案 1 :(得分:13)
在python3中,有bytes()
方法与encode()
的格式相同。
str1 = b'hello world'
str2 = bytes("hello world", encoding="UTF-8")
print(str1 == str2) # Returns True
我在文档中没有读到任何关于此的内容,但也许我没有找到正确的地方。通过这种方式,您可以明确地将字符串转换为字节流,并使其比使用encode
和decode
更具可读性,而无需在引号前优先b
。
答案 2 :(得分:0)
这是一个Python 101类型的问题,
这是一个简单的问题,但答案并非如此简单。
在python3中,“bytes”对象表示一个字节序列,“string”对象表示一系列unicode代码点。
要在“bytes”到“string”之间进行转换,从“string”转换回“bytes”,可以使用bytes.encode和string.decode函数。这些函数采用两个参数,即编码和错误处理策略。
遗憾的是,有很多情况下字节序列用于表示文本,但不一定明确定义了正在使用的编码。
如果您想编写健壮的软件,那么您需要仔细考虑这些参数。您需要仔细考虑字节应该在什么样的编码以及如何处理它们结果不是您认为它们应该处于的编码的有效字节序列的情况.Python默认为UTF-8并且错误输出任何无效的UTF-8字节序列。
打印(bytesThing)
Python使用“repr”作为字符串的后备转换。 repr尝试生成将重新创建对象的python代码。在bytes对象的情况下,这意味着在可打印的ascii范围之外转义字节。
答案 3 :(得分:-1)
尝试:
StringVariable=ByteVariable.decode('UTF-8','ignore')
TO TEST TYPE:
print(type(StringVariable))
这里&#39; StringVariable&#39;表示为字符串。 &#39; ByteVariable&#39;代表Byte。它没有相关问题变量..