Кодировка Python ISO-8859-1

Я столкнулся с огромной проблемой кодирования в Python при работе с набором символов ISO-8859-1 / Latin-1.

При использовании os.listdir для получения содержимого папки я получаю строки, закодированные в ISO-8859-1 (например: `` Ol \ xe1 Mundo ''), однако в интерпретаторе Python та же строка кодируется в другой кодировке :

In : 'Olá Mundo'.decode('latin-1')
Out: u'Ol\xa0 Mundo'

Как я могу заставить Python декодировать строку в тот же формат ?. Я видел, что os.listdir возвращает строки, закодированные правильно, но интерпретатор - нет (символ 'á' соответствует '\ xe1' в ISO-8859-1, а не '\ xa0'):

http://en.wikipedia.org/wiki/ISO/IEC_8859-1

Есть мысли как побороть?


person user1043951    schedule 13.11.2011    source источник
comment
Чтобы быть немного педантичным: os.listdir() возвращает байты. Процесс, назвавший файл, решил дать файлу имя с определенной интерпретацией в iso-8859-1. Имена файлов с таким же успехом можно было бы сохранить в BIG-5 или JIS, и os.listdir() это не заботило бы.   -  person sarnold    schedule 13.11.2011
comment
@sarnold: os.listdir() может возвращать строки или байты: это зависит от того, что вы передаете, и от содержимого каталога.   -  person Thanatos    schedule 14.11.2011


Ответы (1)


Когда вы вводите строковый литерал, отличный от Unicode, в интерактивном сеансе python2, для него будет принята системная кодировка по умолчанию.

Похоже, что вы используете Windows, и поэтому кодировка по умолчанию, вероятно, "cp850" или "cp437":

C:\>python
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdin.encoding
'cp850'
>>> 'Olá Mundo'
'Ol\xa0 Mundo'
>>> u'Olá Mundo'.encode('cp850')
'Ol\xa0 Mundo'

Если вы измените кодовую страницу на 1252 (что примерно эквивалентно latin1), строки будут отображаться должным образом:

C:\>chcp 1252
Active code page: 1252

C:\>python
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdin.encoding
'cp1252'
>>> 'Olá Mundo'
'Ol\xe1 Mundo'
person ekhumoro    schedule 13.11.2011