web-dev-qa-db-ja.com

PowerShellのUTF8スクリプトが誤った文字を出力する

非ASCII文字を使用してPowerShell用のUTF8スクリプトを作成しました。

characters.ps1:

Write-Host "ç â ã á à"

PowerShellコンソールでスクリプトを実行すると、間違った文字が出力されます。

enter image description here

ただし、コンソールで文字を直接書き込むと、期待どおりに表示されます。

enter image description here

誰がその行動の原因を知っていますか?

この問題は、非ASCII文字を含むパスをハードコーディングした筆者が書いたスクリプトから発生しました。パスをコマンドレットに引数として渡そうとすると(フォルダーをロボコピーする場合)、パスを見つけることができないため、コマンドが失敗します(画面に誤って出力されます)。

26
Arthur Nunes

BOMを使用してスクリプトのエンコーディングをUTF-8に変更することで問題が解決しました。

SublimeTextをEncodingHelperプラグインとともに使用して、スクリプトの文字セットを制御していました。 UTF8に正しく設定されました。

SublimeTextのスクリプトのエンコーディングを「UTF-8 with BOM」に変更すると、出力が正しく表示されました。

Notepad ++で同じスクリプトを作成しました。デフォルトでは「UTF-8 with BOM」であり、コンソールに文字列が正しく表示されました。

Notepad ++のスクリプトのエンコーディングを「BOMなしのUTF-8」に変更すると、正しく表示されませんでした。

PowerShellはBOMなしのUTF-8ファイルのエンコードを正しく推測できないようです

68
Arthur Nunes

私の場合、問題は、UTF-8のデフォルトエンコーディングを持つVisual Studio Codeで新しいPowerShellスクリプトを作成したことが原因でした。エンコーディングを「Windows 1252」に設定すると、問題が解決しました。

PowerShellはUTF-8を処理できないようです。「Windows 1252」エンコーディングが必要です。

6
beniwa

Utf8nobomを検出する信頼できる方法があります( https://unicodebook.readthedocs.io/guess_encoding.html )。他の多くのささいなことと同様に、これはPS 6でうまく機能するようです。

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
ç â ã á à
0
js2010