如何使用反斜杠x \ x代码解码ascii字符串

时间:2015-09-24 12:57:31

标签: python string unicode python-2.x

我正在尝试从巴西Portogese文本解码:

  

'Demais Subfun \ xc3 \ xa7 \ xc3 \ xb5es 12'

应该是

  

'DemaisSubfunções12'

>> a.decode('unicode_escape')
>> a.encode('unicode_escape')
>> a.decode('ascii')
>> a.encode('ascii')

所有给予:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 13:
ordinal not in range(128)

另一方面,这给出了:

>> print a.encode('utf-8')
Demais Subfun├â┬º├â┬Áes 12

>> print a
Demais Subfunções 12

1 个答案:

答案 0 :(得分:17)

您有 ASCII编码的二进制数据。 \xhh代码点表示您的数据使用不同的编解码器编码,并且您看到Python生成数据using the repr() function表示,可以将其重新用作Python文字这准确地让您重新创建完全相同的值。调试程序时,此表示非常有用。

换句话说,\xhh转义序列表示单个字节,hh是该字节的十六进制值。你有4个字节,其中包含十六进制值C3,A7,C3和B5,它们不映射到可打印的ASCII字符,因此Python使用\xhh表示法。

您改为使用UTF-8数据,然后对其进行解码:

>>> 'Demais Subfun\xc3\xa7\xc3\xb5es 12'.decode('utf8')
u'Demais Subfun\xe7\xf5es 12'
>>> print 'Demais Subfun\xc3\xa7\xc3\xb5es 12'.decode('utf8')
Demais Subfunções 12

C3 A7字节一起编码U+00E7 LATIN SMALL LETTER C WITH CEDILLA,而C3 B5字节编码U+00F5 LATIN SMALL LETTER O WITH TILDE

ASCII恰好是UTF-8编解码器的一个子集,这就是为什么所有其他字母都可以在Python repr()输出中表示的原因。