Как распечатать Unicode для терминала и перенаправления файлов - PullRequest
0 голосов
/ 03 декабря 2018

Я прочитал все, что есть, чтобы прочитать о Юникоде, UTF-8, кодировании / декодировании и обо всем, но я все еще испытываю трудности.

Я сделал небольшой фрагмент примера, чтобы проиллюстрировать мою проблему.

Я хочу напечатать строку 'Geïrriteerd', как написано здесь.Мне нужно использовать следующий код, чтобы он правильно печатался в файл, если я запускаю его с перенаправлением в файл, например «Test.py> output»

# coding=utf-8
import codecs
import sys

sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)

print u'Geïrriteerd'

Но если я НЕ перенаправляю,код выше выводит «Ge '» rriteerd »на терминал.Если я удалю строку 'codecs.getwriter', она снова будет нормально печататься на терминале, но напечатает 'Ge├> rriteerd' в файл.

Как я могу заставить это печататься правильно в обоих случаях?

Я использую Python 2.7 в Windows 10. Я знаю, что Python 3.x в целом лучше обрабатывает юникод, но я не могу использовать это в своем проекте (пока) из-за других зависимостей.

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Вам нужно сначала «кодировать» свой юникод, чтобы записать в файл или на дисплей.Вам не нужен модуль кодеков. документы предоставляют действительно хорошие примеры для работы с юникодом.

print type(u'Geïrriteerd')
print type(u'Geïrriteerd'.encode('utf-8'))
print u'Geïrriteerd'.encode('utf-8')

with open('test.txt', 'wb') as f:
    f.write(u'Geïrriteerd'.encode('utf-8'))

with open('test.txt', 'r') as f:
    content = f.read()
    print content

#If you want to use codecs still    
import codecs
with codecs.open("test.txt", "w", encoding="utf-8") as f:
    f.write(u'Geïrriteerd')

with open('test.txt', 'r') as f:
    content = f.read()
    print content
0 голосов
/ 03 декабря 2018

Поскольку перенаправление является операцией оболочки, имеет смысл также контролировать кодирование с помощью оболочки.К счастью, Python предоставляет переменную окружения для управления кодировкой.Учитывая test.py:

#!python2
# coding=utf-8
print u'Geïrriteerd'

Чтобы перенаправить в файл с определенной кодировкой, используйте:

C:\>set PYTHONIOENCODING=utf8
C:\>test >out.txt

При нормальном запуске сценария с неопределенным PYTHONIOENCODING будет использоваться кодировка терминала (в моем случае cp437):

C:\>set PYTHONIOENCODING=
C:\>test
Geïrriteerd
0 голосов
/ 03 декабря 2018

Ваш терминал настроен на cp850 вместо UTF-8.

Запуск chcp 65001.

...