Powershell 和 UTF-8

use*_*291 3 powershell utf-8 utf

我有一个用atom创建的html文件test.html,其中包含:

\n\n
\n

测试\xc3\xa9编码utf-8

\n
\n\n

当我使用 Powershell 控制台阅读它时(我使用的是法语 Windows)

\n\n
Get-Content -Raw test.html\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到这个:

\n\n
Test\xc3\x83\xc2\xa9 encoding utf-8\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么重音字符打印不正确?

\n

mkl*_*nt0 7

  • Atom编辑器默认创建没有BOM 的UTF-8 文件(从跨平台的角度来看,这是正确的做法)。

  • Windows PowerShell [1]仅识别带有伪 BOM 的UTF-8 文件

    • 在没有伪 BOM 的情况下,PowerShell 将文件解释为根据系统的旧版 ANSI 代码页(例如美国系统上的Windows-1252)进行格式化。
      (这也是记事本使用的默认编码,它不仅在读取文件时,而且在创建文件时也将其称为“ANSI”。Windows PowerShell 的Get-Content/也是如此Set-Content(其中调用此编码Default,并且是实际的默认编码,因此不需要未指定);相比之下,Out-File/默认> 创建UTF-16LE 编码文件 ( )。)Unicode

因此,为了Get-Content在 Windows PowerShell 中正确 识别无 BOM 的UTF-8 文件,您必须使用-Encoding utf8.


[1] 相比之下,跨平台PowerShell Core版本值得称赞的是默认为 UTF-8,在读取和写入时跨 cmdlet 一致,因此即使没有 BOM,它也能正确解释 UTF-8 编码的文件,并且默认情况下还会创建没有 BOM 的文件。