如何在PowerShell中正确/全局地获取UTF-8(无BOM)文件?

Nei*_*gan 13 powershell byte-order-mark utf-8 powershell-4.0

创建一个文件utf8.txt.确保编码为UTF-8(无BOM).将其内容设置为

cmd.exe:

type utf8.txt > out.txt

内容out.txt

在PowerShell(v4)中:

cat .\utf8.txt > out.txt

要么

type .\utf8.txt > out.txt

Out.txt内容是 €

如何全局使PowerShell正常工作?

mkl*_*nt0 15

与底层.NET框架[1]不同,Windows PowerShell 使用以下默认值:

  • 输入:文件没有BOM(字节顺序标记)被假定为在系统的默认编码,这是遗留 Windows代码页("ANSI"代码页:活性,特定文化的单字节编码,配置通过控制面板).

  • 输出上:>>>重定向操作符默认生成UTF-16 LE文件(它们有 - 并且需要 - 一个BOM).

文件消耗和生成cmdlet 通常支持-Encoding允许您显式指定编码参数.
在PowerShell v5.1之前,Out-File显式使用底层cmdlet是更改编码的唯一方法.
PowerShell v5.1 +中,>>>成为有效的别名Out-File,允许您更改>>>通过$PSDefaultParameterValues首选项变量的编码行为; 例如:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'.

要使PowerShell正确处理UTF-8,您必须将其指定为输入和输出编码[2] ,但请注意,在输出时,PowerShell 总是会向UTF-8文件添加BOM.

适用于您的示例:

Get-Content -Encoding utf8 .\utf8.txt | Out-File -Encoding utf8 out.txt
Run Code Online (Sandbox Code Playgroud)

要在PowerShell中创建没有 BOM 的UTF-8文件,请参阅我的这个答案.


相比之下,PowerShell CorePowerShell跨平台版本,幸运的是在输入和输出上默认使用无BOM的 UTF-8.


[1] .NET框架默认使用UTF-8,用于输入和输出.
这是有意的 - PowerShell与它构建的.NET框架之间的行为差​​异是不寻常的.

Get-Content但是,[2] 会自动识别带有 BOM的UTF-8文件.