【问题标题】:How do I pipe Unicode into a native application in PowerShell如何将 Unicode 通过管道传输到 PowerShell 中的本机应用程序
【发布时间】: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


【解决方案1】:

感谢 mike z,以下工作:

$OutputEncoding = [Console]::OutputEncoding = (new-object System.Text.UTF8Encoding $false)
$env:PYTHONIOENCODING = "utf-8"
python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())"

需要new-object 才能获得没有BOMUTF-8 编码。 $OutputEncoding 变量和[Console]::OutputEncoding 似乎都需要设置。

我仍然不完全理解这两个编码值之间的区别,以及为什么你会以不同方式设置它们(这似乎是默认值)。

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 2023-03-08
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2011-01-14
    • 2011-08-09
    相关资源
    最近更新 更多