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の文字コードの扱いについて解説しましたが、ご理解頂けましたでしょうか。文字コードの歴史にからんで色々とややこしい点もありますが、慣れてしまいましょう。
ネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。