@serkom

Как подружить командную строку Windows c юникодом в программе на Python 3.5?

Делаю программу на Python 3.5 Одна из функций программы - вывод HTML из файла в командную строку Windows с подсветкой некоторых тегов разными цветами. Чтение html производится в utf-8. Если вывод оставить также в юникоде, то программа работает только при запуске из командной строки и только с ключевым словом "python". При прямом запуске .py файла, и, соответственно, при запуске полученного с помощью pyinstaller файла .exe программа работает ровно до того момента, когда дело доходит до вывода html, а потом падает с ошибкой:

Traceback (most recent call last)
...
File "C:\...\program.py", line 508, in print_html
print('{1} {blue}{0}{endblue}'.format(line, num, blue='\033[96m', endblue='\033[0m'))
File "C:\Python\Python35\lib\encodings\cp866.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\ufeff' in position 7: character maps to <undefined>


Если для каждой строки файла указать:

str.encode().decode('cp866')

программа при запуске с ключевым словом "python" выдаёт на месте кириллицы крокозябры, а при прямом запуске всё работает почти неплохо. За исключением того момента, что теперь теги неправильно подсвечиваются. К примеру, должны быть подсвечены символы с 45 до знака ">", программа же начинает подсвечивать строку с 25 символа, где находится просто текст, соответственно все дальнейшие теги сдвигаются. Видимо в dos-овской кодировке как-то не так идёт подсчёт символов. А в юникоде программа вообще отказывается что-то выводить. Также для командной строки в коде указан параметр

os.system('chcp 65001')

Как всё-таки сделать вывод в юникоде?
  • Вопрос задан
  • 523 просмотра
Решения вопроса 1
Sly_tom_cat
@Sly_tom_cat
.
Все символы unicode просто не могут быть представлены в cp866.
Если вы на входе имеете utf-8 то в нем python 3+ все прекрасно должен обработать.
Если вам на выводе нужно поменять кодировку - то менять ее нужно именно на выводе. Т.е. сначала все форматируете а потом енкодите в нужную кодировку.

Вызов с python и просто исполняемый - различаться в принципе не должны... но возможно у вас две версии питона стоят и с python вы вызываете одну, а при вызове .py по path находится другой.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы