Сложность работы с Unicode от sys.stdin - PullRequest
0 голосов
/ 15 января 2019

Это сводит меня с ума в данный момент.Из моих последних дней исследований ясно, что юникод - сложная тема.Но вот поведение, к которому я не знаю, как обращаться.

Если я читаю файл с не-ASCII-символами с диска и записываю его обратно в файл, все работает как запланировано.однако, когда я читаю тот же файл из sys.stdin, id не работает, и символы не-ASCII не кодируются должным образом.Пример кода здесь:

# -*- coding: utf-8 -*-
import sys

with open("testinput.txt", "r") as ifile:
    lines = ifile.read()

with open("testout1.txt", "w") as ofile:
    for line in lines:
        ofile.write(line)

with open("testout2.txt", "w") as ofile:
    for line in sys.stdin:
        ofile.write(line)

Файл ввода testinput.txt выглядит так:

を
Sōten_Kōro

, когда я запускаю сценарий из командной строки как cat testinput.txt | python test.py, я получаю следующий выводсоответственно:

testout1.txt:

を Sōten_Kōro

testout2.txt:

??? S??ten_K??ro

Есть идеи, какадрес это было бы очень полезно.Благодарю.Пол.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Спасибо за указатели. Я нашел следующую реализацию на основе ответа и ссылки @ GiacomoCatenazzi:

# -*- coding: utf-8 -*-
import sys
import codecs

with open("testinput.txt", "r") as ifile:
    lines = ifile.read()

with open("testout1.txt", "w") as ofile:
    for line in lines:
        ofile.write(line)

UTF8Reader = codecs.getreader('utf-8')
sys.stdin = UTF8Reader(sys.stdin)
with open("testout2.txt", "w") as ofile:
    for line in sys.stdin:
        ofile.write(line.encode('utf-8'))

Однако я не уверен, почему необходимо снова кодировать после использования codecs.getreader?

Пол

0 голосов
/ 15 января 2019

Причина в том, что вы выбрали короткий путь, который никогда не следует делать.

Вы всегда должны определять кодировку. Поэтому, когда вы читаете файл, вы должны указать, что вы читаете UTF-8 или когда-либо еще. Или просто укажите, что вы читаете двоичные файлы.

В вашем случае интерпретатор python будет использовать UTF-8 в качестве стандартной кодировки при чтении из файлов, поскольку это значение по умолчанию в Linux и macos.

Но при чтении из стандартного ввода значение по умолчанию определяется кодировкой локали или переменной среды.

Я имею в виду Как изменить кодировку stdin на python , как решить. Этот ответ просто для объяснения причины.

...