2012-12-23 28 views
59

这是一个Python 101类型的问题,但当我尝试使用一个似乎将字符串输入转换为字节的包时,它让我感到困惑。如何在Python 3中的字节和字符串之间进行转换?

正如您将在下面看到的,我为自己找到了答案,但我觉得这值得在这里记录,因为我花时间挖掘发生了什么事情。它似乎对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字符正在变成官样文章结束了。

+1

[This question](http://stackoverflow.com/questions/7585435/best-way-to-convert-string-to-bytes-in-python-3)在答案中给出了更多细节,但我认为下面的简要回答更加清晰。 – Bobble

回答

89

上面的代码示例中的“压榨机”在做的这相当于:

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')。如果未指定编码,则不报告错误。

+0

如果你看看实际的方法实现,你会发现'utf-8'是默认编码,因为你知道编码确实是'utf-8',即'stringThing.encode( )'和'bytesThing.decode()'将会很好。 – ccpizza

+0

@ccpizza在上面的例子中明确地给出了编码,这使得它更加清晰,恕我直言是一种很好的做法。并非所有的unicode都是UTF-8。它也避免了最后一段提到的沉默失败。 – Bobble

+0

完全同意;显式比隐式更好,但是我们很好地知道**是什么**隐含的。是否使用它是另一个问题。仅仅因为你可以并不意味着你应该:) – ccpizza

11

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

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

我在文档中没有读到任何关于此的信息,但也许我没有在正确的位置寻找。通过这种方式,您可以明确地将字符串转换为字节流,并且使其可读性高于使用encodedecode,并且不必在引号前面指定优先b

1

尝试:

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

TO测试类型:

print(type(StringVariable)) 

这里StringVariable'表示为一个字符串。 'ByteVariable'表示为Byte。它不相关的问题变量..

相关问题