Как можно это исправить? Пробовал разные костыли, ничего не помогло
Ответ
Кракозябры указывают на то, что текст закодированный в одной кодировке показывается в другой (несовместимой кодировке):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print(u"Привет, мир!".encode('cp1251').decode('cp866')) #XXX: don't do it
# -> ╧ЁштхЄ, ьшЁ!
ANSI кодировка (cp1251), используемая в Windows, может отличается от OEM кодировки (cp866), используемой в консоле с cmd.exe. Например, это может произойти, если прочитать текстовый файл, как бинарный и вывести результат (последовательность байт) как есть.
Правильный подход: считывать текст, используя unicode тип и печатать строго unicode — пример в вопросе явно показывает почему не следует жёстко прописывать какую-либо кодировку — кодировка, которая работает в одном окружении, может перестать работать в другом.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import io
with io.open('input_file.txt', encoding='utf-8') as file:
for line in file:
print(line.replace(u"мир", u"Юникод"), end='')
encoding='utf-8' нужно заменить на действительную кодировку входного файла. Эта кодировка никак не связана с кодировкой исходного кода. Если кодировку не указать, то io.open() использует locale.getpreferredencoding(False) (что-нибудь вроде cp1251 на русской Винде).
Если кодировка неизвестна, то можно только гадать что файл содержит (хотя некоторые варианты могут быть более вероятны чем другие, см. chardet модуль).
Если перенаправить вывод в файл, то необходимо установить PYTHONIOENCODING переменную окружения:
Z:\> set PYTHONIOENCODING=utf-8
Z:\> python your_script.py >output-utf8.txt
Кодировку можно выбрать любую, которая поддерживает полный набор символов, которые могут быть напечатаны your_script.py
Чтобы напечатать все Юникодные символы в консоль, даже те которые не могут быть представлены в текущей кодировке, используемой в консоле, можно использовать win-unicode-console пакет (идея состоит в использовании WriteConsoleW() win32 API):
Z:\> py -mpip install win-unicode-console
Z:\> py -mrun your_script.py
Если выставить подходящий шрифт в окне консоли, то любые (BMP) Юникодные символы можно увидеть (независимо от текущей кодировки консоли), а не только 256 символов, которые могут быть представлены в 8-битной кодировке такой как cp866.
Комментариев нет:
Отправить комментарий