powershellの文字コードについての備忘録

アバター
tk-xleader
記事: 158
登録日時: 14年前
連絡を取る:

powershellの文字コードについての備忘録

投稿記事 by tk-xleader » 9年前

 いろいろ調べてみたところ、$OutputEncodingと[Console]::OutputEncodingという変数が重要なキーを握っているようです。上記変数は両方ともSystem.Text.Encoding型のオブジェクトです。内部文字列は.NETベースなので、System.String型が扱っているUTF-16LEなのでしょう。

 $OutputEncodingはpowershellのコマンドレットを外部プロセスに渡すときに使われるエンコードです。デフォルトでASCIIに設定されていますが、[Text.Encoding]::Defaultや、[Text.Encoding]::UTF8などを渡すことで変更可能です。[Console]::OutputEncodingはコンソールの入出力に使われるエンコードです。これはデフォルトではGetACP()で取得できるコードページに設定されているみたいですね。

 標準出力をリダイレクトした場合、BOM付きのUTF-16LEで出力されるようです。また、パイプラインによって外部プロセスを呼び出した場合、powershell→外部プロセスは$OutputEncodingにしたがってUTF-16から変換されてそれが外部プロセスの標準入力として引き渡されます。この場合で、System::Text::Encoding::UTF8に設定していると、このプロパティで取得できるUTF8EncodingオブジェクトがBOM付きで変換するので、BOM付きのUTF-8テキストが外部プロセスに引き渡されます。
 一方で、外部プロセス→powershellは、[Console]::OutputEncodingにしたがってUTF-16に変換されます。ただし、[Console]::OutputEncodingの値にかかわらず、BOM付きのテキストについては自動判別で処理されるようです。そして、外部プロセスの標準出力は改行によって区切られて、System.String[]に格納されてそれが渡されるようです。

コメントはまだありません。