如何在cmd.exe上进行正确的Unicode和ANSI输出重定向?

sor*_*rin 8 unicode console cmd ansi io-redirection

如果您在Windows上进行自动化并且您正在重定向不同命令的输出(内部cmd.exe或外部,您将发现您的日志文件包含组合的Unicode和ANSI输出(意味着它们无效并且在查看器/编辑器中无法正常加载) ).

是否可以使cmd.exe与UTF-8一起使用?这个问题不是关于stdin/stdout/stderr重定向和Unicode的显示.

我正在寻找一个可以让你的解决方案:

  • 使用UTF-8将内部命令的输出重定向到文件
  • 将支持Unicode的外部命令的输出重定向到文件,但编码为UTF-8.

如果不可能使用批处理文件获得这种一致性,是否有另一种解决此问题的方法,比如使用python脚本编写?在这种情况下,我想知道是否可以单独进行Unicode检测(使用脚本的用户不应该记住被调用的工具是否会输出Unicode,它只是希望将输出转换为UTF-8.

为简单起见,我们假设如果工具输出不是Unicode,则将其视为UTF-8(无代码页转换).

Joe*_*oey 8

您可以使用chcp更改活动代码页.这也将用于重定向文本:

chcp 65001
Run Code Online (Sandbox Code Playgroud)

但请记住,如果cmd使用/u强制Unicode(在本例中为UTF-16)重定向输出的开关启动,则无效.如果该开关处于活动状态,则无论设置的代码页如何,所有输出都将为UTF-16LE chcp.

另请注意,设置为光栅字体时,控制台将无法用于交互式输出.在这种情况下,我得到了有趣的错误消息:

C:\Users\Johannes Rössel\Documents>x
Active code page: 65001

The system cannot write to the specified device.
Run Code Online (Sandbox Code Playgroud)

因此,要么使用合理的设置(控制台的TrueType字体),要么在交互式使用控制台并且路径包含非ASCII字符时不要使用此特技.