我使用非ascii字符为PowerShell创建了一个UTF8脚本。
characters.ps1:
Write-Host "ç â ã á à"
在PowerShell控制台中运行脚本时,它会输出错误的字符。
但是,如果我直接在控制台中编写字符,它们将按预期显示:
有谁知道导致这种行为的原因是什么?
问题来自我编写的脚本,其中包含非编码路径,包括非ascii字符。当我尝试将路径作为参数传递给cmdlet时(在我要复制文件夹的情况下)命令失败,因为它无法找到路径(在屏幕中错误地输出)。
答案 0 :(得分:59)
使用BOM将脚本编码更改为UTF-8解决了这个问题。
我使用SublimeText和EncodingHelper插件来控制脚本的字符集。它被正确设置为UTF8。
我将SublimeText中脚本的编码更改为“带BOM的UTF-8”,输出显示正确。
我使用Notepad ++创建了相同的脚本,默认为“带BOM的UTF-8”,并且在控制台中正确显示了字符串。
我将Notepad ++中脚本的编码更改为“没有BOM的UTF-8”,但显示错误。
似乎PowerShell无法正确猜测没有BOM的UTF-8文件的编码。
答案 1 :(得分:6)
在我的情况下,问题是由使用Visual Studio Code创建一个新的PowerShell脚本引起的,该脚本的默认编码为UTF-8。将编码设置为" Windows 1252"解决了这个问题。
似乎PowerShell无法处理UTF-8,它需要" Windows 1252"编码
答案 2 :(得分:0)
有一种可靠的方法来检测utf8nobom(https://unicodebook.readthedocs.io/guess_encoding.html)。像其他很多小东西一样,这在PS 6中似乎更好用。甚至我最爱的Windows Emacs 25编码也都出错了。
PS C:\users\admin> pwsh
PowerShell 6.1.0
Copyright (c) Microsoft Corporation. All rights reserved.
https://aka.ms/pscore6-docs
Type 'help' to get help.
PS C:\users\admin> "write-host 'ç â ã á à'" | set-content -Encoding utf8NoBOM accent.ps1
PS C:\users\admin> .\accent
ç â ã á à
答案 3 :(得分:-1)
在调用脚本之前尝试这个:
$OutputEncoding = [Console]::OutputEncoding