しばたテックブログ

気分で書いている技術ブログです。

PowerShell Core 6.1.0~6.2.0で日本語が正しく表示されない現象について

事の発端はteratailのこちらの質問から。

teratail.com

Windows 10以前の日本語Windows環境にPowerShell Core 6.1.0をインストールするとコンソールの日本語表示がおかしくなるという現象です。

f:id:stknohg:20181113191609j:plain

【2019.03.29追記】PowerShell Core 6.2への影響

本日PowerShell Core 6.2がリリースされましたが、本件の原因であるPSReadlineがVer.2.0.0-bata.3のまま更新されていないので本エントリーの現象が引き続き発生するはずです。

影響のある環境

きちんと確認できたのは質問にあるWindows 8.1環境だけですが、おそらく、

  • Windows 7
  • Windows Server 2008 R2 ~ Windows Server 2012 R2

でも同じ現象が発生するハズです。

原因

直接の原因はPowerShell Core 6.1.0に同梱されているPSReadlineです。

PowerShell Core 6.1.0から同梱されるPSReadlineのバージョンが1.2→2.0.0-bata.3に上がり、PSReadline 2.0.0-bata.1~2.0.0-bata.3においてはコンソールのコードページをUTF-8(65001)に強制するコードが入ってており、Windows 10以前の古いOSでは日本語の描画がおかしくなってしまいます。

f:id:stknohg:20181113192103j:plain

問題がPowerShell本体ではなくPSReadline側にあるので、Windows PowerShellにPSReadline 2.0.0をインストールしても同様の現象が発生してしまいます。

f:id:stknohg:20181113193107j:plain

(Windows PowerShellにPSReadline 2.0.0をインストールする手順は割愛)

対処方法

この問題に対する対処方法は2つあります。

1. PSReadline 1.2を使用する

PSReadline 2.0.0が問題なのでひとつ前のバージョンを利用する様にすれば現象を回避することができます。

次のコマンドでPSReadline 1.2を追加インストールしてからPowerShell Coreを再起動するとPSReadline 1.2を先にロードする様になりこの問題を回避できます。

# PSReadline 1.2を追加インストール後、コンソールを再起動
Install-Module PSReadLine -Scope CurrentUser -RequiredVersion 1.2 -Force -SkipPublisherCheck

f:id:stknohg:20181113193829j:plain

2. 最新ビルドのPSReadline 2.0.0を使用する

PSReadlineの最新ビルドではコードページの強制に対して以下の修正が入っています。

github.com

この修正自体は別件に対する対応と思われるのですが、コードページの変更を強制しなくなるため本件の対応としても有用です。

ただし、この修正が適用されたPSReadlineはまだリリースされていません。
(おそらくPSReadline 2.0.0-beta.4に含まれるでしょう...)
このため手っ取り早い方法としてはPSReadineの最新ビルドをインストールしてやるのが良いでしょう。

以下にざっくりとですが手順を記載しておきます。

  1. AppVeyor上の最新ビルドから最新のビルド(Zipファイル)をダウンロードします。
    f:id:stknohg:20181113200234j:plain

  2. Zipファイルを展開し、展開した内容を[マイドキュメント]\PowerShell\Modules\PSReadLine\2.0.0に保存します。
    f:id:stknohg:20181113200729j:plain
    (上図の構成になる様にしてください)

これで最新のPSReadlineがロードされ問題を回避することができます。

f:id:stknohg:20181113201010j:plain