ファイルutf8.txt
を作成します。エンコーディングがUTF-8(BOMなし)であることを確認します。その内容を€
に設定します
cmd.exe
:
type utf8.txt > out.txt
out.txt
の内容は€
です
PowerShell(v4)の場合:
cat .\utf8.txt > out.txt
または
type .\utf8.txt > out.txt
Out.txtの内容は€
です
PowerShellをグローバルに正しく機能させるにはどうすればよいですか?
Windows PowerShell、基盤となる.NETフレームワークとは異なり[1] 、次のデフォルトを使用します:
on input:files BOM(byte-order mark)なしはシステムのデフォルトエンコーディング、つまりレガシーWindowsコードページ(「ANSI」コードページ:アクティブな、文化固有のシングルバイトエンコーディング、コントロールパネルで構成) 。
on output:>
および>>
リダイレクト演算子はUTF-16 LEファイルはデフォルトで(BOMがあり、必要です)。
ファイルを消費および生成するコマンドレットは通常、エンコーディングを明示的に指定できる-Encoding
パラメーターをサポートします。
PowerShell v5.1より前は、基になるOut-File
コマンドレットを明示的に使用することが、エンコーディングを変更する唯一の方法でした。
PowerShell v5.1 +では、>
と>>
がOut-File
の有効なエイリアスになりました、>
設定変数を介して>>
および$PSDefaultParameterValues
のエンコード動作を変更できます。例えば。:$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
。
PowerShellでUTF-8を適切に処理するには、入力エンコーディングと出力エンコーディングの両方として指定する必要があります[2] 、ただし、outputでは、PowerShell 常にUTF-8ファイルにBOMを追加することに注意してください。
あなたの例に適用:
Get-Content -Encoding utf8 .\utf8.txt | Out-File -Encoding utf8 out.txt
PowerShellでUTF-8ファイルなし BOMを作成するには、 この回答 を参照してください。
対照的に、PowerShell Core、幸いなことに、PowerShellのcross-platformエディションデフォルトはBOM-less UTF-8で、入力と出力の両方で。
[1] .NET Frameworkは、入力と出力の両方にデフォルトでUTF-8を使用します。
これは、PowerShellとそれが構築されている.NET Frameworkの動作の意図的な違いであり、異常です。
[2] Get-Content
は、ただし、UTF-8ファイルを自動的に認識しますwith BOM。