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

2024-05-16 13:46:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如:

Python2.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'

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


Tags: 字符串字节常规utfencode斜杠strx80
3条回答

在Python 2中,字节字符串和常规字符串是相同的,因此不需要通过str()进行转换。在Python 3中,字符串总是Unicode字符串,因此字节字符串的str()进行转换。

你可以做你自己的转换,而不是做你想做的:

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

在Python3示例中,您是在插入Unicode字符串,而不是像Python2中那样插入字节字符串。

在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中,有类型strunicodestr表示一个简单的字节字符串,而unicode是一个Unicode字符串。

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

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

这将生成Python 3中的最后一行:

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

现在,我如何在最终结果后对进行编码,这是您应该始终做的事情:获取传入对象,将其解码为unicode(无论您如何执行此操作),然后,在生成输出时,使用您选择的编码对其进行编码。不要试图处理原始字节字符串。这只是一种丑恶的行为。

相关问题 更多 >