Python 3: 如何获取字节串的字符串字面量表示?
在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一样的结果。
3 个回答
在Python 2中,字节字符串和普通字符串是一样的,所以用str()
这个函数不会进行任何转换。而在Python 3中,字符串总是Unicode字符串,所以对字节字符串使用str()
时会进行转换。
你可以自己做转换,按照你想要的方式来处理:
x2 = ''.join(chr(c) for c in x)
在你的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
和unicode
。str
表示简单的字节字符串,而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(无论你怎么做),然后在输出时,按照你选择的编码进行编码。不要尝试处理原始字节字符串。那样做既麻烦又过时。