在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得到的结果。
在Python 2,你有类型的str
和unicode
。 str
代表一个简单的字节串,而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(怎么过你这样做),然后进行输出时,编码到你选择的编码。 不要试图处理原始字节的字符串。 这只是丑陋和推荐行为。
在你的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')
在Python 2,字节串和普通字符串是相同的,所以有秉乘没有转换str()
。 在Python 3的字符串总是Unicode字符串,所以str()
的字节字符串的确实的转化率。
你可以做自己的转换而不是你想要做什么:
x2 = ''.join(chr(c) for c in x)