此刻正在推动我有点发疯。从我最近的研究中可以清楚地看到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
任何解决此问题的想法都会有很大帮助。谢谢。保罗。
答案 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
之后是否需要再次编码?
保罗