![Windows CMD 和 PowerShell 重定向和文本编码有什么区别?](https://linux22.com/image/1490379/Windows%20CMD%20%E5%92%8C%20PowerShell%20%E9%87%8D%E5%AE%9A%E5%90%91%E5%92%8C%E6%96%87%E6%9C%AC%E7%BC%96%E7%A0%81%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
当然,这不是一个好标题,但说实话,如果不发表一篇文章作为问题,我不知道该如何措辞这个问题。这个描述应该会更充实一些。
问题:
我有一个 Python 脚本(不是我写的),我在 Windows 中使用 Python 2.7 运行它。这个脚本比较基础,可以从各种来源提取信息并将输出打印到终端。其中一些输出使用非 ASCII 字符集中的字符,这就是乐趣的开始。
虽然 Python 脚本在终端中运行正常,并打印到屏幕上,但当我添加文件重定向时,我收到一个错误,并且 Python 脚本崩溃了。经过大量研究,这似乎归结为 Python 2.7 处理 Unicode 的方式,我通过为 Python 设置 Windows 环境变量来解决这个问题。这是:
$env:PYTHONIOENCODING="UTF-8"
在 PowerShell 中,以及
Set PYTHONIOENCODING="UTF-8"
在 CMD 中。
好的,现在 Python 脚本输出可以重定向到文件而不会崩溃。问题是,这两个环境给出的结果不同。运行 Python 脚本的基本格式是:
python pythonscript.py parm1 > test.txt
虽然这在 CMD 和 PowerShell 中都有效,但我最终得到的文件具有不同的编码和字符。例如,导致问题的字符是ø
。如果我在 CMD 中运行上述行,则生成的文件将被编码为UTF-8
并正确显示此字符。在 PowerShell 中,运行相同的命令会导致文件编码为UCS-2 LE BOM
(如 NotePad++ 中所示),并且上述字符实际上显示为 2 个字符├©
。
更奇怪的是,如果我不在任一环境中重定向(因此,只需打印到终端),两者都会显示不正确的字符。
我也尝试过在 PowerShell 中通过管道传输到 Out-file CmdLet,因此:
python pythonscript.py parm1 | out-file -encoding UTF8 test.txt
这会导致文件编码为UTF-8-BOM
,但仍然会出现不正确的字符。我在这里尝试了不同的编码类型,虽然最终得到了不同的文件编码和不同的字符,但似乎都不正确。
我还通过运行 查看了两种环境的代码页chcp
。在这两种情况下,都会返回Active code page: 850
。我尝试将 PowerShell 设置为代码页65001
(即utf-8
),但这并没有什么区别。
所以,我彻底糊涂了。