web-dev-qa-db-ja.com

バックスラッシュx \ xコードを使用してASCII文字列をデコードする方法

私はブラジルの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

notASCIIエンコードされているバイナリデータがあります。_\xhh_コードポイントは、データがでエンコードされていることを示します別のコーデックで、Pythonはデータの表現を生成します repr()関数を使用) Pythonリテラルとして再利用でき、まったく同じ値を正確に再作成できます。この表現は、プログラムをデバッグするときに非常に役立ちます。

つまり、_\xhh_エスケープシーケンスは個々のバイトを表し、hhはそのバイトの16進値です。 16進値C3、A7、C3、およびB5の4バイトがあり、印刷可能な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バイトは一緒に + 00E7 LATIN SMALL LETTER C WITH CEDILLA をエンコードし、C3 B5バイトは + 00F5 LATIN SMALL LETTER O WITH TILDE をエンコードします。

ASCIIはたまたまUTF-8コーデックのサブセットであるため、他のすべての文字をPython repr()出力でそのように表すことができます。

18
Martijn Pieters