将PowerShell的默认输出编码更改为UTF-8

rwa*_*ace 70 powershell utf-8 character-encoding

默认情况下,当您将命令的输出重定向到文件或将其传递到PowerShell中的其他内容时,编码为UTF-16,这是无用的.我想把它改成UTF-8.

它可以通过替换>foo.txt语法来逐个进行,| out-file foo.txt -encoding utf8但是每次都必须重复这是很尴尬的.

在PowerShell中设置内容的持久方法是将它们放入\Users\me\Documents\WindowsPowerShell\profile.ps1; 我已经验证这个文件确实是在启动时执行的.

有人说输出编码可以设置,$PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}但我已经尝试过,它没有任何效果.

https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/谈到$OutputEncoding乍一看似乎应该是相关的,但后来谈到输出被编码在ASCII中,这不是实际发生的事情.

如何设置PowerShell使用UTF-8?

mkl*_*nt0 108

  • PSv5.1或更高,其中>>>是有效的别名Out-File,你可以设置默认的编码>/ >>/ Out-File通过$PSDefaultParameterValues选项变量:

    • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • PSv5.0或更低版本上,您无法更改>/ 的编码>>,但是,在PSv3或更高版本上,上述技术适用于调用Out-File.
    ($PSDefaultParameterValues偏好变量是在PSv3.0中引入的).

  • PSv3.0或更高,如果你想设置的默认编码为所有支持的cmdlet
    -Encoding参数
    (在PSv5.1 +包括>>>),使用:

    • $PSDefaultParameterValues['*:Encoding'] = 'utf8'

如果将此命令放在您的$PROFILE cmdlet中,Out-File并且Set-Content默认情况下将使用UTF-8编码,但请注意,这使其成为会话全局设置,将影响未明确指定编码的所有命令/脚本.

同样,请确保在您希望以相同方式运行的脚本或模块中包含此类命令,以便即使在由其他用户或其他计算机运行时它们的行为也确实相同.

警告:PowerShell,从v5.1开始,总是使用(伪)BOM创建UTF-8文件,这通常只在Windows世界中使用 - 基于Unix的实用程序无法识别此BOM(见底部).


自动$OutputEncoding变量不相关,仅适用于PowerShell与外部程序通信的方式(PowerShell在向其发送字符串时使用的编码方式) - 它与输出重定向运算符和PowerShell cmdlet用于保存到文件的编码无关.


可选阅读:跨平台视角:

PowerShell现在是跨平台的,通过其PowerShell 核心版本,其编码 - 合理 - 默认为无BOM的UTF-8,与类Unix平台一致.

  • 这意味着没有BOM的源代码文件被假定为UTF-8,并且使用>/ Out-File/ Set-Content默认为无BOM的 UTF-8; 明确使用utf8 -Encoding参数也会创建无BOM的 UTF-8,但您可以选择使用伪BOM 创建带有utf8bom值的文件.

  • 如果您在类似Unix的平台上使用编辑器创建PowerShell脚本,现在甚至在具有跨平台编辑器(如Visual Studio Code和Sublime Text)的Windows上创建PowerShell脚本,生成的*.ps1文件通常不会具有UTF-8伪BOM:

    • 这在PowerShell Core上运行良好.
    • 如果文件包含非ASCII字符,它可能会在Windows PowerShell上中断; 如果您确实需要在脚本中使用非ASCII字符,请将它们保存为带有BOM的 UTF-8 .
      如果没有BOM,Windows PowerShell(mis)会将您的脚本解释为在旧版"ANSI"代码页中进行编码(由Unicode前应用程序的系统区域设置决定;例如,美英系统上的Windows-1252).
  • 相反,文件有UTF-8的伪BOM可以在类Unix平台有问题的,因为它们会导致Unix工具,例如cat,sedawk-甚至一些编辑器,例如gedit-到通过传递伪BOM,即将其视为数据.

    • 这可能并不总是一个问题,但绝对可以,例如,当您尝试将文件读入字符串中bash时,例如,text=$(cat file)text=$(<file)- 结果变量将包含伪BOM作为前3个字节.

  • 我不反对,@EliaWeiss,但它特别是 Windows PowerShell,他们最终在 PowerShell _Core_ 中得到了正确的解决。 (2认同)
  • @Marc:VS Code 和其他现代跨平台编辑器值得称赞地默认为 UTF-8,但是,这意味着它们会误解 ANSI 编码的文件。记事本使用*启发式*来*猜测*编码。关键是这只是一个*猜测*,因为任何 UTF-8 编码的文件也是技术上有效的 ANSI 编码文件(但反之则不然)。如果 Windows 上的所有内容都像 Unix 类平台那样在没有 BOM 的情况下默认为 UTF-8,那就太好了,但事实并非如此,尤其是在 Windows PowerShell 中,尽管幸运的是现在在 PowerShell Core 中就是这种情况。 (2认同)
  • 要查看当前值(如果有),只需输入“$PSDefaultParameterValues” (2认同)