Python 3:如何获得字节字符串的字符串文字表示?

时间:2013-03-13 16:02:02

标签: python python-3.x escaping

在Python 3中,如何将字节字符串插入常规字符串并获得与Python 2相同的行为(即:只获取没有b前缀或双反斜杠的转义码?)

e.g:

Python 2.7:

>>> x = u'\u041c\u0438\u0440'.encode('utf-8')
>>> str(x)
'\xd0\x9c\xd0\xb8\xd1\x80'
>>> 'x = %s' % x
'x = \xd0\x9c\xd0\xb8\xd1\x80'

Python 3.3:

>>> x = u'\u041c\u0438\u0440'.encode('utf-8')
>>> str(x)
"b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'"
>>> 'x = %s' % x
"x = b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'"

注意如何使用Python 3,我在输出中获得b前缀并使用双下划线。我想得到的结果是我在Python 2中得到的结果。

3 个答案:

答案 0 :(得分:5)

在Python 2中,您有类型strunicodestr表示简单的字节字符串,而unicode是Unicode字符串。

对于Python 3,这改变了:现在str是Python 2中的unicode,而byte是Python 2中的str

因此,当您执行("x = %s" % '\u041c\u0438\u0440').encode("utf-8")时,您实际上可以省略u前缀,因为它是隐含的。在python中未显式转换的所有内容都是unicode。

这将产生你在Python 3中的最后一行:

 ("x = %s" % '\u041c\u0438\u0440').encode("utf-8")

现在我如何在最终结果之后对进行编码,这是你应该经常做的事情:获取一个传入的对象,将其解码为unicode(如何做到这一点)然后,在进行输出时,以您选择的编码进行编码。不要尝试处理原始字节字符串。这只是丑陋和弃用的行为。

答案 1 :(得分:4)

在Python 3示例中,您将插入到Unicode字符串中,而不是像Python 2中那样的字节字符串。

在Python 3中,bytes不支持插值(字符串格式化或有什么用)。

要么连接,要么全部使用Unicode,只在插值时进行编码:

b'x = ' + x

'x = {}'.format(x.decode('utf8')).encode('utf8')

x = '\u041c\u0438\u0440'  # the u prefix is ignored in Python 3.3
'x = {}'.format(x).encode('utf8')

答案 2 :(得分:0)

在Python 2中,字节字符串和常规字符串是相同的,因此str()没有完成转换。在Python 3中,字符串始终是Unicode字符串,因此字节字符串的str()进行转换。

您可以进行自己的转换,而不是按照自己的意愿进行转换:

x2 = ''.join(chr(c) for c in x)