8

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

例如:

蟒蛇 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'

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

4

3 回答 3

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')
于 2013-03-13T16:08:33.537 回答
5

在 Python 2 中,您有类型strunicode. str表示一个简单的字节字符串,而unicode是一个 Unicode 字符串。

对于 Python 3,情况发生了变化:现在strunicodePython 2byte中的内容,也是strPython 2 中的内容。

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

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

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

现在我如何在最终结果之后进行编码,这是您应该始终执行的操作:获取传入的对象,将其解码为 un​​icode(您是如何做到的),然后在进行输出时,以您选择的编码对其进行编码。不要尝试处理原始字节字符串。那只是丑陋和过时的行为。

于 2013-03-13T16:12:06.923 回答
0

在 Python 2 中,字节字符串和常规字符串是相同的,因此str(). 在 Python 3 中,字符串始终是 Unicode 字符串,因此str()对字节字符串进行转换。

您可以进行自己的转换,而不是做您想做的事情:

x2 = ''.join(chr(c) for c in x)
于 2013-03-13T16:12:21.340 回答