如何在Python 3中的字节和string之间进行转换?
这是一个Python 101types的问题,但是当我尝试使用一个似乎将我的stringinput转换为字节的包时,它让我感到莫名其妙。
正如你将在下面看到的,我为自己find了答案,但是我觉得这是值得在这里logging的,因为我花时间去挖掘正在发生的事情。 它似乎是Python 3的通用,所以我没有提到我正在玩的原始包; 它似乎不是一个错误(只是特定的包有一个.tostring()
方法,显然不产生我所理解的string…)
我的testing程序是这样的:
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'
所以,需要能够在字节和string之间进行转换,以避免非ASCII字符变成gobbledegook。
上面的代码示例中的“mangler”与此相当:
bytesThing = stringThing.encode(encoding='UTF-8')
还有其他的方法来写这个(特别是使用bytes(stringThing, encoding='UTF-8')
,但是上面的语法使得它明显地发生了什么,以及如何恢复string:
newStringThing = bytesThing.decode(encoding='UTF-8')
当我们这样做时,原始string被恢复。
注意,使用str(bytesThing)
只是转录所有的gobbledegook而不把它转换回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
在文档中我没有读到任何关于这个的信息,但也许我没有find正确的地方。 这样你就可以显式地将string转换成字节stream,并且比使用encode
和decode
更具可读性,而且不需要在引号之前。
尝试这个:
StringVariable=ByteVariable.decode('UTF-8','ignore')
testingtypes:
print(type(StringVariable))
这里'StringVariable'表示为一个string。 “ByteVariable”表示为Byte。 它不相关的问题variables..