2012-02-17 5 views
1

Использование Python 3.2, я пытаюсь расшифровать байт с использованием ул (байт, «cp1251»), но я получаю эту ошибку:Python с использованием неправильного кодирования

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».

ответ

5

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

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

Смежные вопросы