Сложность работы с Unicode от sys.stdin

[...] Если я хочу получить строку, содержащую 5 \, должен ли я писать 10 \ [...]

Да, вы должны. Чтобы записать одиночную \ в строке, вы пишете ее как "\\".

Это связано с тем, что \ является специальным символом, зарезервированным для escape символом который следует за ним. (Возможно, вы признаете \n как новую строку.) Также полезно, если вы хотите написать строку, содержащую один файл ". Вы записываете его как "\"".

Причина, по которой \\\str недействительна, заключается в том, что она интерпретируется как \\ (что соответствует одному \), за которым следует \s, что недействителен, поскольку «escape-код s» не имеет значения.

0
задан Paul 15 January 2019 в 16:46
поделиться

2 ответа

Спасибо за указатели. Я нашел следующую реализацию на основе ответа и ссылки @ 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?

Пол [ 114]

0
ответ дан Paul 15 January 2019 в 16:46
поделиться

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

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

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

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

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

0
ответ дан Giacomo Catenazzi 15 January 2019 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: