Pau*_*ore 5 python unicode powershell encoding pipeline
我有一个用Python编写的本机程序,期望它在stdin上输入.举个简单的例子,
#!python3
import sys
with open('foo.txt', encoding='utf8') as f:
f.write(sys.stdin.read())
Run Code Online (Sandbox Code Playgroud)
我希望能够将(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())"
?
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我甚至无法解释这里发生了什么.基本上,我希望test(python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())")打印出一个欧元符号.要理解为什么,我必须做任何需要的工作:-)(因为那时我可以将这些知识转化为我的真实场景,这是能够编写不破坏的Python程序的工作流水线当他们遇到Unicode字符时).
感谢 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())"
Run Code Online (Sandbox Code Playgroud)
需要new-object获得没有BOM 的UTF-8编码。该变量和两者似乎都需要设置。$OutputEncoding[Console]::OutputEncoding
我仍然不完全理解这两个编码值之间的区别,以及为什么你会对它们进行不同的设置(这似乎是默认值)。
| 归档时间: |
|
| 查看次数: |
565 次 |
| 最近记录: |