为什么“Out-File”似乎忽略了“Encoding”参数?

为什么“Out-File”似乎忽略了“Encoding”参数?

我正在尝试将输出保存到文件:

SFC | Out-File -FilePath out.txt

现在,如果我out.txt在 Notebook 中打开,我希望看到

You must be an administrator running a console session in order to
use the sfc utility.

以下是我实际看到的情况:

Y o u   m u s t   b e   a n   a d m i n i s t r a t o r   r u n n i n g   a   c o n s o l e   s e s s i o n   i n   o r d e r   t o   
 
 
u s e   t h e   s f c   u t i l i t y . 

基于这个答案,我补充道-Encoding UTF8

SFC | Out-File -FilePath out.txt -Encoding UTF8

但这并没有什么区别。

我的 PowerShell 版本:7.2.2

答案1

PowerShell 7 的默认输出编码已经是 UTF-8。问题不在于 PowerShell 将文本编码到文件中,而在于解码本机程序打印的文本sfc。您可以通过查看写入文件之前的字符序列来证明这一点:

sfc | % { $_.ToCharArray() }

注意每对实字符之间的空格 - 这些是零/空字符,通过进一步的管道传输可以看到% { [int]$_ }。SFC 显然是在 Windows 双字节 Unicode 编码中打印其输出,但 PowerShell 正在使用 UTF-8 或某些单字节编码来解释它,因此它会看到一个额外的空字符,而 SFC 表示前一个字符的高字节。Out-File然后忠实地将这些空字符编码为 UTF-8 中的单个零字节。

解决方案是告诉 PowerShell,本机程序将以双字节 Unicode 编写其输出:

[System.Console]::OutputEncoding = [System.Text.Encoding]::Unicode

相关内容