Python3中的unicode-escape不能处理非ASCII字节?

11

在Python2中,有string-escapeunicode-escape。对于UTF-8字节字符串,string-escape可以转义\并保留非ASCII字节,例如:

"你好\\n".decode('string-escape')
'\xe4\xbd\xa0\xe5\xa5\xbd\n'

然而,在Python3中,string-escape已被移除。我们需要将字符串编码为字节,并使用unicode-escape进行解码:

"This\\n".encode('utf_8').decode('unicode_escape')
'This\n'

它可以使用ASCII字节,但非ASCII字节也会被转义:

"你好\\n".encode('utf_8')
b'\xe4\xbd\xa0\xe5\xa5\xbd\\n'
"你好\\n".encode('utf_8').decode('unicode_escape').encode('utf_8')
b'\xc3\xa4\xc2\xbd\xc2\xa0\xc3\xa5\xc2\xa5\xc2\xbd\n'

所有非ASCII字节都被转义,这会导致编码错误。

那么有没有解决方法呢?在Python3中是否可能保留所有非ASCII字节并解码所有转义字符?

1个回答

5
import codecs
codecs.getdecoder('unicode_escape')('你好\\n')

1
这个不起作用;解码器会在应用解码之前隐式地将字符串编码为UTF-8,然后解码将UTF-8字节转换为单个字符。我从上面的代码中得到 ('ä½\xa0好\n', 8) - Karl Knechtel
哦,你说得对。那个方法现在已经不起作用了。我不确定发生了什么变化。我也找不到现在可行的解决方案。https://github.com/python/cpython/issues/65530 似乎解释了这个问题,但没有说明是何时出现的。https://dev59.com/sanka4cB1Zd3GeqPKzyf 现在只适用于 ASCII(我想)。 - raylu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接