解码从非ascii字符串中转义Python 3中的unicode

时间:2015-07-09 20:05:06

标签: python unicode encoding escaping decode

我一直在寻找几个小时来找到一种完全反转str.encode调用结果的方法:

"testäch基er".encode("cp1252", "backslashreplace")

结果是

b'test\xe4ch\\u57faer'

现在我想用

将其转换回来
b'test\xe4ch\\u57faer'.decode("cp1252")

我得到了

'testäch\\u57faer'

那么如何让我的基础回来?我通过使用decode(“unicode-escape”)代替它(它适用于这个例子),但是假设用iso8859-1编码的字节不是cp1252,所以80到9F之间的任何字符都是错误的。< / p>

2 个答案:

答案 0 :(得分:4)

嗯...

>>> b'test\xe4ch\\u57faer'.decode('unicode-escape')
'testäch基er'

但是 backslashreplace - &gt; unicode-escape 一致往返。如果原始字符串中有反斜杠,则它们不会被backslashreplace编码,但它们将被unicode-escape解码,并替换为意外字符。

>>> '☃ \\u2603'.encode('cp1252', 'backslashreplace').decode('unicode-escape')
'☃ ☃'

无法可靠地反转已使用errors后备编码的字符串编码,例如backslashreplace。这就是为什么它是一个后备,如果你可以一直编码和解码它,它将是一个真正的encoding

答案 1 :(得分:1)

当我问这个问题时,我对Python还是很陌生。现在,我了解到这些后备机制仅用于处理意外错误,而不是用于保存和还原数据的东西。如果您确实需要一种简单可靠的方法来用ASCII编码单个unicode字符,请查看quote模块中的unquoteurllib.parse函数。