如何在PowerShell中正确/全局分类UTF-8(无BOM)文件?(转到另一个文件)

如何在PowerShell中正确/全局分类UTF-8(无BOM)文件?(转到另一个文件),powershell,utf-8,powershell-4.0,byte-order-mark,Powershell,Utf 8,Powershell 4.0,Byte Order Mark,创建一个文件utf8.txt。确保编码为UTF-8(无BOM)。将其内容设置为€ 在cmd.exe中: 键入utf8.txt>out.txt out.txt的内容是€ 在PowerShell(v4)中: cat.\utf8.txt>out.txt 或 类型。\utf8.txt>out.txt Out.txt的内容是 如何在全局范围内使PowerShell正常工作?注意:此答案是关于Windows PowerShell(直到v5.1)PowerShell[Core,v6+],PowerShell的

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

cmd.exe
中:

键入utf8.txt>out.txt

out.txt的内容是

在PowerShell(v4)中:

cat.\utf8.txt>out.txt

类型。\utf8.txt>out.txt

Out.txt的内容是


如何在全局范围内使PowerShell正常工作?

注意:此答案是关于Windows PowerShell(直到v5.1)PowerShell[Core,v6+],PowerShell的跨平台版本,现在幸运的是在输入和输出上都默认为无BOM的UTF-8


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

  • 输入时:不带BOM(字节顺序标记)的文件假定为系统默认编码,这是传统的()(“ANSI”代码页:活动的、特定于区域性的单字节编码,通过控制面板配置)

  • 输出时:默认情况下,
    >
    重定向操作符生成UTF-16 LE文件(这些文件确实具有并且需要BOM)

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

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

适用于您的示例:

Get-Content -Encoding utf8 .\utf8.txt | Out-File -Encoding utf8 out.txt
要在PowerShell中创建没有BOM表的UTF-8文件,请参阅我的


[1] .NET Framework默认使用(无BOM)UTF-8进行输入和输出。
Windows PowerShell和它所构建的框架之间的这种故意的行为差异是不寻常的。PowerShell[Core]v6+中的差异消失了:.NET[Core]和PowerShell[Core]都默认为无BOM的UTF-8


[2]
获取内容
会自动识别带有BOM表的UTF-8文件。

对于PowerShell 5.1,启用此设置:

控制面板,区域,管理,更改系统区域设置,使用Unicode UTF-8 全球语言支持

然后将其输入PowerShell:

$PSDefaultParameterValues['*:Encoding'] = 'Default'
或者,您可以升级到PowerShell 6或更高版本