【发布时间】:2014-09-03 11:06:30
【问题描述】:
我有一个用 Python 编写的本机程序,它需要在标准输入上输入。举个简单的例子,
#!python3
import sys
with open('foo.txt', encoding='utf8') as f:
f.write(sys.stdin.read())
我希望能够将 (PowerShell) 字符串作为标准输入传递给该程序。 Python 期望其标准输入采用$env:PYTHONIOENCODING 中指定的编码,我通常将其设置为UTF8(这样我就不会收到任何编码错误)。
但无论我做什么,角色都会被破坏。我在网上搜索并找到了更改[Console]::InputEncoding/[Console]::OutputEncoding 或使用chcp 的建议,但似乎没有任何效果。
这是我的基本测试:
PS >[Console]::OutputEncoding.EncodingName
Unicode (UTF-8)
PS >[Console]::InputEncoding.EncodingName
Unicode (UTF-8)
PS >$env:PYTHONIOENCODING
utf-8
PS >python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())"
´╗┐?
PS >chcp 1252
Active code page: 1252
PS >python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())"
?
PS >chcp 65001
Active code page: 65001
PS >python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())"
?
我该如何解决这个问题?
我什至无法解释这里发生了什么。基本上,我希望测试 (python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())") 打印出一个欧元符号。为了理解为什么,我必须尽一切努力让它发挥作用:-)(因为这样我就可以将这些知识转化为我的真实场景,即能够编写工作管道Python 程序在遇到 Unicode 字符时不会中断)。
【问题讨论】:
-
你试过设置
$OutputEncoding吗? -
更糟糕的是:
>$OutputEncoding = [Text.Encoding]::UTF8 >$env:PYTHONIOENCODING="utf-8" >python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())" ∩╗┐╬ô├⌐┬╝(抱歉格式问题,我无法在评论中换行...) -
啊,但是如果我也将 [Console]::OutputEncoding 设置为 UTF8,这似乎可行!你能解释一下为什么吗?我不清楚为什么我需要设置两次值...
-
另外,有些东西似乎在开头添加了一个空格(可能是 BOM)。我该如何避免呢?
-
好吧,我猜这很有道理。
[Console]::OutputEncoding绝对不同于 $OutputEncoding。这个blog post 是我产生这个想法的地方。
标签: python powershell unicode encoding pipeline