Python использует неправильную кодировку - PullRequest
1 голос
/ 17 февраля 2012

Используя python 3.2, я пытаюсь декодировать байты, используя str (bytes, "cp1251"), но получаю эту ошибку:

Traceback (most recent call last):
  File "C:\---\---\---\---.py", line 4, in <module>
    writetemp.write(str(f.read(), "cp1251"))
  File "C:\Python32\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 19-25: character     maps to <undefined>

Как видите, я указал "cp1251", но этопопытка использовать для декодирования «cp1252.py» вместо «cp1251.py», что, по-моему, вызывает ошибку.То же самое происходит, если я пытаюсь «Windows-1251» вместо «cp1251».

1 Ответ

5 голосов
/ 17 февраля 2012

Обратите внимание, что вы получаете UnicodeEncodeError, , а не a UnicodeDecodeError.Ошибка не приходит с вашего str(f.read(), "cp1251") вызова.Вместо этого он поступает из вызова writetemp.write().

Вызов str() декодирует байты, которые вы получаете из f.read(), используя cp1251 в качестве кодировки.Это работает.Это дает вам строку (которая является юникодом в Python 3.) writetemp.write() затем необходимо преобразовать строку обратно в байты, кодируя ее.Это делается с помощью кодировки, которую вы передали при открытии writetemp, или кодировки ввода-вывода по умолчанию (которую Python пытается угадать, основываясь на различных вещах.) Вы можете узнать, какая это кодировка, посмотрев на атрибут encoding файлаобъект.Вы, вероятно, обнаружите, что это cp1252.Если вы хотите писать в определенной кодировке, не полагайтесь на догадки Python;явно указывайте кодировку при открытии файла.

...