Python 3: 如何获取字节串的字符串字面量表示?

9 投票
3 回答
9804 浏览
提问于 2025-04-17 18:57

在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 个回答

0

在Python 2中,字节字符串和普通字符串是一样的,所以用str()这个函数不会进行任何转换。而在Python 3中,字符串总是Unicode字符串,所以对字节字符串使用str()时会进行转换。

你可以自己做转换,按照你想要的方式来处理:

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

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

在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(无论你怎么做),然后在输出时,按照你选择的编码进行编码。不要尝试处理原始字节字符串。那样做既麻烦又过时。

撰写回答