41

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

字符.ps1:

Write-Host "ç â ã á à"

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

在此处输入图像描述

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

在此处输入图像描述

有谁知道是什么导致了这种行为?

问题来自我编写的脚本,该脚本具有包含非 ascii 字符的硬编码路径。当我尝试将路径作为参数传递给 cmdlet 时(在我要 robocopy 文件夹的情况下),命令失败,因为它找不到路径(在屏幕上错误地输出)。

4

4 回答 4

93

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

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

我将 SublimeText 中脚本的编码更改为“带有 BOM 的 UTF-8”,并且输出显示正确。

我使用 Notepad++ 创建了相同的脚本,默认为“UTF-8 with BOM”,并且该字符串在控制台中正确显示。

我将 Notepad++ 中脚本的编码更改为“不带 BOM 的 UTF-8”,但显示不正确。

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

于 2013-01-23T14:56:06.817 回答
10

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

PowerShell 似乎无法在没有 BOM 的情况下处理 UTF-8,它需要“Windows 1252”或“UTF8 with BOM”编码。

于 2017-05-03T19:39:26.180 回答
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
ç â ã á à
于 2018-11-08T18:05:40.907 回答
-1

在调用你的脚本之前试试这个:

 $OutputEncoding = [Console]::OutputEncoding
于 2013-01-23T14:42:35.333 回答