PowerShell だけで処理しているときには、文字コードが default の UTF-8 になっていても問題無いのですが、PowerShell 以外と連携する際に文字コードの違いが問題になることがあります。
ファイル出力の Out-File とかには -Encoding オプションがあるので、S-JIS にするのであれば
Default を指定すれば S-JIS で出力されます。
ところが、オンメモリーで文字コードを変更するにはファイル出力コマンドレットは使えません。
そんな時は、こんな感じで .NET Framework の System.Text.Encoding を使って文字コード変換します。
|
オンメモリーで文字コード変更はこれで良いのですが、clip.exe に日本語を引き渡す際にはこの手が使えません。
これは、$OutputEncoding が Default だと US-ASCII になっているので、S-JIS 文字列を渡そうとしてもリダイレクト時に日本語がうまく扱えないからです。
結論から言うと、$OutputEncoding を S-JIS に変更して clip.exe にリダイレクトすれば文字化けしません。
# S-JIS に変更 $OutputEncoding = [Console]::OutputEncoding # US-ASCII に戻す $OutputEncoding = New-Object System.Text.ASCIIEncoding |
では実験です。
まずはデフォルト状態で clip.exe に日本語文字列を渡します。
PS C:\> "日本語文字列" | clip |
これを実行して、テキストエディタにペーストすると
?????? |
このように日本語が化けています。
この時の $OutputEncoding を見ると、以下のようになっています。
PS C:\> $OutputEncoding IsSingleByte : True BodyName : us-ascii EncodingName : US-ASCII HeaderName : us-ascii WebName : us-ascii WindowsCodePage : 1252 IsBrowserDisplay : False IsBrowserSave : False IsMailNewsDisplay : True IsMailNewsSave : True EncoderFallback : System.Text.EncoderReplacementFallback DecoderFallback : System.Text.DecoderReplacementFallback IsReadOnly : True CodePage : 20127 |
それでは、$OutputEncoding を S-JIS に変更します。
PS C:\> $OutputEncoding = [Console]::OutputEncoding PS C:\> "日本語文字列" | clip |
これを実行して、テキストエディタにペーストすると
日本語文字列 |
今度は文字化けしていません。
この時の $OutputEncoding を見ると、以下のようになっています。
PS C:\> $OutputEncoding BodyName : iso-2022-jp EncodingName : 日本語 (シフト JIS) HeaderName : iso-2022-jp WebName : shift_jis WindowsCodePage : 932 IsBrowserDisplay : True IsBrowserSave : True IsMailNewsDisplay : True IsMailNewsSave : True IsSingleByte : False EncoderFallback : System.Text.InternalEncoderBestFitFallback DecoderFallback : System.Text.InternalDecoderBestFitFallback IsReadOnly : True CodePage : 932 |
Copyright © MURA All rights reserved.