【发布时间】:2013-09-26 17:46:47
【问题描述】:
在对 stackoverflow 和 python 2.7 doc 进行了几天的研究之后,我对此没有任何结论。
基本上,我在 Windows 服务器上运行一个 python 脚本,该脚本必须有一个文本块作为输入。这个文本块(不幸的是)必须通过管道传递。比如:
PS > [something_that_outputs_text] | python .\my_script.py
所以问题是:
服务器使用cp1252编码,由于行政法规之类的,我真的无法更改。当我将文本通过管道传输到我的 python 脚本时,当我阅读它时,它已经带有 ? 而像 \xe1 这样的字符应该是。
到目前为止我做了什么:
使用 UTF-8 测试。是的,chcp 65001 和 $OutputEncoding = [Console]::OutputEncoding “解决它”,因为在 python 中完美地获取文本,然后我可以将其解码为 unicode 等。但显然他们不允许我在服务器 /sadface 上这样做。
一个小脚本来测试到底发生了什么:
import codecs
import sys
def main(argv=None):
if argv is None:
argv = sys.argv
if len(argv)>1:
for arg in argv[1:]:
print arg.decode('cp1252')
sys.stdin = codecs.getreader('cp1252')(sys.stdin)
text = sys.stdin.read().strip()
print text
return 0
if __name__=="__main__":
sys.exit(main())
尝试使用 codecs 包装和不使用它。
我的输入和输出:
PS > echo "Blá" | python .\testinput.py blé
blé
Bl?
--> 所以参数 (blé) 没有问题,但管道文本 (Blá) 不好:(
我什至将text 字符串转换为十六进制,是的,它被3f(又名?)淹没了,所以print 没有问题。
[另外:这是我在这里的第一个问题......请随时询问有关我所做的更多信息]
编辑
我不知道这是否相关,但是当我这样做时 sys.stdin.encoding 它会产生 None
更新:所以...我对 cmd 没有任何问题。在 cmd 上运行程序时检查了sys.stdin.encoding,一切正常。我想我的头爆炸了。
【问题讨论】:
-
只想补充一点,同时幸运的是,我得到了一台 Linux 服务器,并且编码一切正常……不再为 PowerShell 头疼。
标签: python powershell character-encoding pipe cp1252