从非 ascii 字符串解码 Python 3 中的转义 unicode
Decoding escaped unicode in Python 3 from a non-ascii string
我现在已经搜索了几个小时,想找到一种方法来完全反转 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 之间的任何字符都是错误的。
嗯...
>>> b'test\xe4ch\u57faer'.decode('unicode-escape')
'testäch基er'
但是 backslashreplace
->unicode-escape
不是 一致的往返。如果原始字符串中有反斜杠,它们不会被 backslashreplace
编码,但会被 unicode-escape
解码,并替换为意外字符。
>>> '☃ \u2603'.encode('cp1252', 'backslashreplace').decode('unicode-escape')
'☃ ☃'
无法可靠地反转已使用 errors
回退编码的字符串的编码,例如 backslashreplace
。这就是为什么它是后备的,如果你能始终如一地对其进行编码和解码,那将是一个真正的 encoding
.
当我问这个问题时,我对 Python 还是很陌生。现在我明白了,这些回退机制只是为了处理意外错误,而不是保存和恢复数据。如果您确实需要一种简单可靠的方法来以 ASCII 编码单个 unicode 字符,请查看 urllib.parse
模块中的 quote
和 unquote
函数。
我现在已经搜索了几个小时,想找到一种方法来完全反转 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 之间的任何字符都是错误的。
嗯...
>>> b'test\xe4ch\u57faer'.decode('unicode-escape')
'testäch基er'
但是 backslashreplace
->unicode-escape
不是 一致的往返。如果原始字符串中有反斜杠,它们不会被 backslashreplace
编码,但会被 unicode-escape
解码,并替换为意外字符。
>>> '☃ \u2603'.encode('cp1252', 'backslashreplace').decode('unicode-escape')
'☃ ☃'
无法可靠地反转已使用 errors
回退编码的字符串的编码,例如 backslashreplace
。这就是为什么它是后备的,如果你能始终如一地对其进行编码和解码,那将是一个真正的 encoding
.
当我问这个问题时,我对 Python 还是很陌生。现在我明白了,这些回退机制只是为了处理意外错误,而不是保存和恢复数据。如果您确实需要一种简单可靠的方法来以 ASCII 编码单个 unicode 字符,请查看 urllib.parse
模块中的 quote
和 unquote
函数。