Python 3中:我如何获得一个字节的字符串的字符串文字表示?(Python 3: How do

2019-08-17 14:07发布

在Python 3,我怎么插一个字节字符串转换为普通字符串,并获得相同的行为像Python 2(即:得到公正的转义代码,而不b前缀或双反斜线)?

例如:

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得到的结果。

Answer 1:

在Python 2,你有类型的strunicodestr代表一个简单的字节串,而unicode是一个Unicode字符串。

对于Python 3,这改变了:现在str是什么unicode在Python 2和byte是什么str在Python 2。

所以,当你这样做("x = %s" % '\u041c\u0438\u0440').encode("utf-8")你其实可以省略u前缀,因为它是隐含的。 未明确在Python转换一切是unicode。

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

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

现在,我的最终结果,这是你应该总是做如何编码:取传入的对象,其解码为Unicode(怎么过你这样做),然后进行输出时,编码到你选择的编码。 不要试图处理原始字节的字符串。 这只是丑陋和推荐行为。



Answer 2:

在你的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')


Answer 3:

在Python 2,字节串和普通字符串是相同的,所以有秉乘没有转换str() 。 在Python 3的字符串总是Unicode字符串,所以str()的字节字符串的确实的转化率。

你可以做自己的转换而不是你想要做什么:

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


文章来源: Python 3: How do I get a string literal representation of a byte string?