PowerShell中的UTF8脚本输出不正确的字符

Art*_*nes 29 powershell utf-8 character-encoding

我使用非ascii字符为PowerShell创建了一个UTF8脚本.

characters.ps1:

Write-Host "ç â ã á à"
Run Code Online (Sandbox Code Playgroud)

在PowerShell控制台中运行脚本时,它会输出错误的字符.

在此输入图像描述

但是,如果我直接在控制台中编写字符,它们将按预期显示:

在此输入图像描述

有谁知道是什么原因造成这种行为?

问题来自于我编写的脚本,其中包含非编码路径,包括非ascii字符.当我尝试将路径作为参数传递给cmdlet时(在我将要复制文件夹的情况下)命令失败,因为它无法找到路径(在屏幕中输出错误).

Art*_*nes 71

使用BOM将脚本编码更改为UTF-8解决了该问题.

我使用SublimeText和EncodingHelper插件来控制脚本的字符集.它被正确设置为UTF8.

我将SublimeText中脚本的编码更改为"带BOM的UTF-8",输出显示正确.

我用Notepad ++创建了相同的脚本,默认为"带BOM的UTF-8",并且在控制台中正确显示了字符串.

我将Notepad ++中脚本的编码更改为"没有BOM的UTF-8",并且显示不正确.

似乎PowerShell无法正确猜测没有BOM的UTF-8文件的编码.

  • 这很可悲.特别考虑[多么无意义和无用](/ questions/2223882/whats-different-between-utf-8-and-utf-8-without-bom)UTF-8 BOM是.虽然+1为*启发信息*. (14认同)
  • 我猜想,在没有 BOM 的情况下,出于遗留原因,Windows 会采用 Windows-1252 编码,而 Linux 则采用 UTF-8。 (2认同)

小智 6

在我的情况下,问题是由使用Visual Studio Code创建一个新的PowerShell脚本引起的,该脚本的默认编码为UTF-8.将编码设置为"Windows 1252"解决了问题.

看来PowerShell无法处理UTF-8,它需要"Windows 1252"编码.