Home > Windows にまつわる e.t.c.

Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)


PowerShell だけで処理しているときには、文字コードが default の UTF-8 になっていても問題無いのですが、PowerShell 以外と連携する際に文字コードの違いが問題になることがあります。

ファイル出力の Out-File とかには -Encoding オプションがあるので、S-JIS にするのであれば Default を指定すれば S-JIS で出力されます。
ところが、オンメモリーで文字コードを変更するにはファイル出力コマンドレットは使えません。

そんな時は、こんな感じで .NET Framework の System.Text.Encoding を使って文字コード変換します。

function Conv2SJIS($UTF8String) {
    $ByteData = [System.Text.Encoding]::UTF8.GetBytes($UTF8String)
    $SJISString = [System.Text.Encoding]::Default.GetString($ByteData)
    return $SJISString
}

 

オンメモリーで文字コード変更はこれで良いのですが、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

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.