PowerShellの文字コードについて解説!文字化けで困らないための対処法

PowerShellの文字コードについて解説!文字化けで困らないための対処法

PowerShellの文字コードとは?


PowerShellはMicrosoftが開発したシェル機能です。シェルとはウィンドウでコマンドを入力して色々な処理ができる機能です。Windowsには以前からコマンドプロンプトと言うシェルがありますが、PowerShellはそれの機能強化版と言えます。

文字コードは文字を表現するルールです。文字にはそれぞれ番号がついていて、コンピュータの内部では、文字列は数値として処理されていますが、その番号の付け方のルールを文字コードと言います。

PowerShellを使うにあたり、文字コードをどう扱うかをこの記事で解説します。

US-ASCIIは文字コードの基本

PowerShellでの文字コードの扱いを解説する前に、まず文字コードについて知っておきましょう。たくさんある文字コードの中で、知っておくべきものは4つあります。まず1つめはUS-ASCIIです。

US-ASCIIは数字とアルファベットの小文字・大文字と記号から成り、0から127の128種類しかない、とてもシンプルな文字コードです。英語圏ならこれでほとんど事足ります。US-ASCIIはその後の多くの文字コードの基礎になっています。

日本ではShift_JISとEUC-JPが普及していった

しかし日本語にはひらがな・かたかなと漢字があるので、US-ASCIIでは表現できません。そこで日本のWindows向けにShift_JISと言う文字コードが作られました。これはUS-ASCIIに加えてひらがな・かたかな・日本語で主に使われる漢字が追加されていて、日本で広く普及しました。

日本で使われるコンピュータはWindowsだけではありません。UNIXでは日本語向けにUS-ASCIIを拡張したEUC-JPと言う文字コードが作られました。そしてUNIXベースのLinuxでも利用されています。

Unicodeは全世界の文字に対応している

このように言語毎に文字コードが違うという状況のため、ネットで海外のサイトを見ても文字化けするという状況が長く続き、文字コードを世界で統一しようという動きが出てきました。そして生まれたのがUnicodeです。

では、今後はUnicodeだけを使えばいいのかと言えば、そう簡単ではありません。Unicodeは世界中の文字に番号を振っただけでのもので、実際に文字コードとして使う場合はUnicodeを元に作られたUTF-8かUTF-16を使用します。なおその2つは符号化方式と言われます。

UTF-8Nとは何?

現在の文字コードはUTF-8が主流になっているので、なるべくこの文字コードを使うようにするべきです。なおテキストエディタ等を使用しているとUTF-8Nという言葉を見かけます。これはUTF-8とは別の文字コードなのでしょうか。

実はUTF-8Nという文字コードは存在せず、これはBOM(Byte Order Mark)をつけていないという意味になります。BOMとはUTF-8のテキストの先頭につける16進数のEF BB BFという3つの数値で、「このテキストはUTF-8ですよ」という意味です。

BOM無しUTF-8を使いましょう

しかし現在は、BOMは使われません。UTF-8かどうかはデータの中身で判別するのが主流になったからです。そのためUTF-8Nを選択できるアプリはそれを選択し、UTF-8NがなくてUTF-8のみの場合、BOM無しを選択できるならそうしましょう。

つまりUTF-8Nは、BOM無しUTF-8という意味です。そしてBOM無しUTF-8がただUTF-8と呼ばれるようになったので、UTF-8NがUTF-8であるというややこしい状況になっています。

またそれ以外にもUTF-8には、全言語対応なのでShift_JISよりサイズが大きくなるという、日本人から見た欠点もあります。UTF-8はこういった問題を含んでいるのですが、ともかくBOM無しUTF-8を使うということで考えておけば間違いはないでしょう。

文字コードの初期状態を確認する

前置きが長くなりましたが、PowerShellでの文字コードの扱いについて見て行きましょう。PowerShellで現在使っている文字コードを確認するには、以下のように入力します。

$OutputEncoding.EncodingName

初期状態では以下のように出てきます。

US-ASCII

US-ASCIIになっているということです。

様々なコードでファイルの中身を表示してみる

では次に、テキストファイルに「あいうえお」と記述して、Shift_JISでtest.txtと言う名前で保存し、以下のコマンドで中身を表示してみます。

Get-Content test.txt

すると以下のように正しく表示されます。

あいうえお

次はUTF-8のBOMありで保存して、また中身を表示してください。今回も正しく表示されます。次はUTF-8N、BOM無しで保存して中身を表示します。

縺ゅ>縺・∴縺

文字化けしてしまいました。PowerShellはUTF-8を自動判別しないので、BOMがないとShift_JISと判断してしまうのです。BOM無しが主流になっているのでやっかいです。

文字コード指定のファイル出力

そこで以下のように文字コードを指定して開きましょう。

Get-Content test.txt -Encoding UTF8

今回は正しく「あいうえお」と表示されました。では次にファイル出力はどうでしょうか。

Write-Output あいうえお > test.txt

test.txtをテキストエディタで開くとUnicodeになっています。UTF-8で保存する方法は以下のようにします。ただしBOMありになるので注意してください。

Write-Output あいうえお | Out-File test.txt -Encoding UTF8

BOM無しUTF-8やShift_JISで出力

BOM無しUTF-8で出力するには、以下のように.Netの UTF8Encodingを利用すれば可能です。PowerShellの標準機能だけでは無理ということです。

$UTF8NoBomEnc = New-Object System.Text.UTF8Encoding $False
[System.IO.File]::WriteAllLines(“c:\test\test.txt”, “あいうえお”, $UTF8NoBomEnc)

なおShift_JISで出力するには、以下のようにします。WindowsではShift_JISがデフォルトということです。

Write-Output あいうえお | Out-File test.txt -Encoding default

|で日本語を受け渡しすると文字化けしてしまう

PowerShellでは別のアプリに出力を渡せます。例えば以下のようにすれば、クリップボードにabcdeという文字列を渡してペーストできます。

Write-Output abcde | clip

ところが以下のようにすると、ペーストしても?????と言う文字しか出ません。

Write-Output あいうえお | clip

理由はPowerShellの出力はUnicodeですが、Windowsのクリップボードの文字コードはShift_JISであるため文字化けしているのです。

出力文字コードを変更すれば解消

以下のようにしてみても文字化けは解消されません。

Write-Output あいうえお -Encoding default | clip

この問題を解消するには、以下のようにします。

$OutputEncoding = [Console]::OutputEncoding

Consoleの出力はShift_JISになっているので、これを実行した後では文字化けが解消します。なお明確にShift_JISと指定したい場合は以下でもかまいません。

$OutputEncoding = [System.Text.Encoding]::GetEncoding(‘Shift_JIS’)

|による受け渡しで文字化けする時はこれを利用しましょう。

PowerShellの文字コード指定に気を付けよう

PowerShellの文字コードの扱いについて解説しましたが、ご理解頂けましたでしょうか。文字コードの歴史にからんで色々とややこしい点もありますが、慣れてしまいましょう。

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。