# coding=ascii
bad_string = 'x9a'
expected = u'š'
good_string = bad_string.decode('unicode-escape').encode('utf-8')
if good_string != expected:
raise AssertionError()
我希望上述测试能够通过,但是我收到以下错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
我在这里错过了什么?
(我不能简单地将bad_string
更改为 unicode。 这些是从外部源到达的字符串(
'x9a'
中没有任何转义字符。转义是字符串文本的一部分,表示的字节只有一个:[0x9a]
。编码可能是Windows-1252,因为这很常见,并且在0x9a处有š,但你真的必须知道它是什么。要解码为 Windows-1252:
good_string = bad_string.decode('cp2512')
如果您实际拥有的是'\x9a'
(一个反斜杠,三个其他字符(,那么您需要先将其转换为上述形式。正确的方法取决于逃跑者最初是如何设法到达那里的。如果它来自 Python 字符串文本,请先使用string-escape
:
good_string = bad_string.decode('string-escape').decode('cp2512')