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

Bac*_*sau 4 python unicode encoding decode escaping

我已经搜索了几个小时来找到一种方法来完全反转 str.encode 调用的结果,如下所示:

"testäch?er".encode("cp1252", "backslashreplace")
Run Code Online (Sandbox Code Playgroud)

结果是

b'test\xe4ch\\u57faer'
Run Code Online (Sandbox Code Playgroud)

现在我想把它转换回来

b'test\xe4ch\\u57faer'.decode("cp1252")
Run Code Online (Sandbox Code Playgroud)

我得到

'testäch\\u57faer'
Run Code Online (Sandbox Code Playgroud)

那么我如何得到我的?背部?我通过使用 decode("unicode-escape") 来接近那里(它适用于这个例子),但假设字节编码为 iso8859-1 而不是 cp1252,所以 80 和 9F 之间的任何字符都是错误的。

bob*_*nce 5

好...

>>> b'test\xe4ch\\u57faer'.decode('unicode-escape')
'testäch?er'
Run Code Online (Sandbox Code Playgroud)

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

>>> '? \\u2603'.encode('cp1252', 'backslashreplace').decode('unicode-escape')
'? ?'
Run Code Online (Sandbox Code Playgroud)

没有办法可靠地反转使用errors后备编码的字符串的编码,例如backslashreplace. 这就是为什么它是后备的原因,如果您可以始终如一地对其进行编码和解码,它将是一个真正的encoding.


Bac*_*sau 2

当我问这个问题时,我对 Python 还很陌生。现在我明白这些回退机制只是为了处理意外错误,而不是为了保存和恢复数据。如果您确实需要一种简单可靠的方法来对 ASCII 中的单个 unicode 字符进行编码,请查看该模块中的quote和函数。unquoteurllib.parse