Windows CMD 和 PowerShell 重定向和文本编码有什么区别?

Windows CMD 和 PowerShell 重定向和文本编码有什么区别?

当然,这不是一个好标题,但说实话,如果不发表一篇文章作为问题,我不知道该如何措辞这个问题。这个描述应该会更充实一些。

问题:

我有一个 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),但这并没有什么区别。

所以,我彻底糊涂了。

相关内容