难以处理sys.stdin中的Unicode

时间:2019-01-15 15:00:36

标签: windows python-2.7 unicode stdin

此刻正在推动我有点发疯。从我最近的研究中可以清楚地看到unicode是一个复杂的话题。但这是我不知道该如何解决的行为。

如果我从磁盘上读取了一个具有非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 :(得分:2)

原因是您选择了捷径,这是绝对不应该的。

您应该始终定义编码。因此,在读取文件时,应指定正在读取UTF-8,或在任何时候读取。或者只是明确表明您正在读取二进制文件。

在您的情况下,从文件读取时,python解释器将使用UTF-8作为标准编码,因为这是Linux和macos中的默认设置。

但是,当您从标准输入中读取内容时,默认设置是由区域设置编码或环境变量定义的。

我参考How to change the stdin encoding on python来解决问题。这个答案只是为了解释原因。

答案 1 :(得分:0)

感谢指针。我已经基于@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之后是否需要再次编码?

保罗