Я пытаюсь записать текст и кодировать его в UTF-8, где это возможно, используя следующий код:питон UTF-8 кодирование бросает UnicodeDecodeError несмотря на «ошибки =" заменить»
outf.write((lang_name + "," + (script_name or "") + "\n").encode("utf-8", errors='replace'))
I «получаю следующее сообщение об ошибке:
File "C:\Python27\lib\encodings\cp1252.py", line 15, in decode
return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 6: character maps to <undefined>
Я думал errors='replace'
часть моего кодирования вызова будет справиться с этим?
FWIW, я просто открыть файл с
outf = open(outfile, 'w')
без явного объявления кодировки.
print repr(outf)
производит:
<open file 'myfile.csv', mode 'w' at 0x000000000315E930>
Я отделен заявление на запись в отдельную конкатенациях, кодирование и запись файл:
outstr = lang_name + "," + (script_name or "") + "\n"
encoded_outstr = outstr.encode("utf-8", errors='replace')
outf.write(encoded_outstr)
Это конкатенация, что бросает исключение.
струны через print repr(foo)
lang_name: 'G\xc4\x81ndh\xc4\x81r\xc4\xab'
script_name: u'Kharo\u1e63\u1e6dh\u012b'
Далее детективной работы показывает, что я могу сцепить либо один из них с простой ASCII строки без каких-либо трудностей - это положить их обоих в той же строке, что ломать вещи ,
Что такое 'script_code' и' script_name' здесь? У вас есть ** ошибка декодирования **, а не кодировка, поэтому один или оба являются байтами, а не объектами unicode. –
'.encode (" utf-8 ")' в строке Unicode всегда будет работать, поскольку все точки Unicode могут быть представлены как UTF8, поэтому в этом случае 'errors = 'replace'' является излишним. – RemcoGerlich
Далее, что такое 'outf' здесь? Как вы открыли этот объект? Что ваш код пытается декодировать bytestring *, поскольку CP1252 * является подозрительным. Для неявных декодирования это означает, что вы использовали 'sys.setdefaultencoding()' (большое значение no-no), но если 'outf' не является обычным файловым файлом Python 2, а вместо него является файлом' codecs' или 'io', который объясните это исключение. –