在对 stackoverflow 和 python 2.7 文档进行了几天的研究之后,我对此没有任何结论。
基本上我在 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
(AKA mr ?
) 淹没了,所以print
.
[另外:这是我在这里的第一个问题......请随时询问有关我所做的更多信息]
编辑
我不知道这是否相关,但是当我这样做sys.stdin.encoding
时None
更新:所以...我对 cmd 没有任何问题。sys.stdin.encoding
在 cmd 上运行程序时检查,一切正常。我想我的头爆炸了。