web-dev-qa-db-ja.com

PowerShellでUTF-8(BOMなし)ファイルを適切に/グローバルにキャットする方法は?

ファイル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をグローバルに正しく機能させるにはどうすればよいですか?

13
Neil McGuigan

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。

14
mklement0