Сбой Python на действительном символе CP437
Стрелка вниз (↓
) является действительным символом в кодировке CP437. Я пишу программу, которая должна читать и записывать файлы с этой кодировкой, но когда я пытаюсь записать в файл строку, содержащую этот символ, я получаю следующую ошибку:
File "C:\Python34\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2193' in position 0: character maps to <undefined>
То же самое происходит с другими символами CP437, такими как ↔
, Мой код ниже, на случай, если я сделал что-то глупое там...
ENCODING = 'CP437'
def writeFile(name, text):
f = open(name, 'w', encoding = ENCODING)
f.write(text)
f.close()
Согласно Википедии, он действителен в указанной кодировке, так почему же Python говорит мне иначе? Как я могу это исправить?
2 ответа
Вики-страница, на которую вы ссылаетесь, говорит (чуть выше таблицы, на которой стрелка вниз отображается как 0x19
):
Хотя ПЗУ предоставляет графику для всех 256 различных возможных 8-битных кодов, некоторые API не будут печатать некоторые кодовые точки, в частности диапазон 1–31 и код 127. Вместо этого они будут интерпретировать их как управляющие символы. Например, многие методы вывода текста на оригинальном IBM PC будут интерпретировать коды для BEL, BS, CR и LF. Многие принтеры также не смогли распечатать эти символы.
Символ, который вы пытаетесь закодировать, стрелка вниз, является тем же символом, что и управляющий символ ASCII EM
(Конец Среды). Что это будет означать в старой программе, будет зависеть от контекста. В Python символы, упомянутые в приведенной выше цитате (1-31 и 127), всегда интерпретируются как управляющие символы, а не как печатные символы.
Для меня загадка, но делает ли это то, что вам нужно?
f = open('somethin.txt', 'wb')
s1 = ( chr(8595)+chr(8593)+chr(8592)+chr(8594) ) . encode ( 'utf-8' )
s2 = '↓↑←→' . encode ( 'utf-8' )
f.write( s1 )
f.write( s2 )
f.close()
s1 и s2 - идентичные байтовые строки.