Windows 10のBash on Windowsのロケールを英語モードに切り替えるTech TIPS

Bash on Ubuntu on Windowsで日本語を使うと文字化けすることがある。ロケールを英語に変更して文字化けを避ける方法を解説する。

» 2016年10月14日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 10バージョン1607以降(64bit版のみ)



解説

 Windows 10のバージョン1607(Anniversary Update)で導入された「Bash on Ubuntu on Windows」はまだベータ版のためか(原稿執筆時点)、bashのコンソール画面では日本語の表示が乱れる(文字化けする)ことが少なくない。

文字化けるbashの日本語コンソール 文字化けるbashの日本語コンソール
現在のbashのコンソールの実装では、日本語文字をうまく表示できず、一部が欠けたり、化けたりすることがある。だが英語モードだと期待通りに動作する。UNIXやLinuxの管理業務では英語モードのまま使うことも少なくないので、ロケールを英語モードに切り替えて使うという方法もある。
  (1)この部分が欠けている。日本語文字列が含まれていると、なぜか画面の右の方の描画が欠けたり、おかしくなったりする。一度bashウィンドウを最小化してから元に戻したり、スクロールや再描画させると直ることが多い。

 こんな場合は「ロケール」(詳細はすぐ後で説明)の設定を英語モードに変更しておくと文字化けせずに利用できる。

 「ロケール(locale)」とは、ユーザーインタフェースなどに利用する文字コードや言語、そのエンコード方法、日付や時刻、通貨などの書式、各種リソースなどをまとめておいて、簡単に切り替えるようにするための機能である。

 日本語版Windows 10のbashでは、デフォルトでは日本語ロケール「ja_JP.UTF8」が使われている。英語モードにするにはこれを「en_US.UTF8」にすればよい。メッセージなどが全て英語になってしまうが、そもそもUNIXやLinuxの管理では英語のツールも少なくないので慣れておいた方がよい。必要ならコマンドごとにロケールを切り替えて実行することもできる。

 本TIPSでは、ロケールを変更する方法についてまとめておく。

 なおBash on Ubuntu on Windowsの概要や具体的なインストール方法についてはここでは触れないので、以下のTIPSを参照していただきたい。

操作方法

●現在のロケールを確認する

 現在のロケール設定を確認するには、「locale」コマンドを実行するか、「echo $LANG」でLANG変数の内容を表示させる。

user01@PC001:~$ locale  ……現在のロケールを表示させる
LANG=ja_JP.UTF8  ……日本語UTF8になっている
LANGUAGE=
LC_CTYPE="ja_JP.UTF8"
LC_NUMERIC="ja_JP.UTF8"
LC_TIME="ja_JP.UTF8"
LC_COLLATE="ja_JP.UTF8"
LC_MONETARY="ja_JP.UTF8"
LC_MESSAGES="ja_JP.UTF8"
LC_PAPER="ja_JP.UTF8"
LC_NAME="ja_JP.UTF8"
LC_ADDRESS="ja_JP.UTF8"
LC_TELEPHONE="ja_JP.UTF8"
LC_MEASUREMENT="ja_JP.UTF8"
LC_IDENTIFICATION="ja_JP.UTF8"
LC_ALL=
user01@PC001:~$ echo $LANG  ……LANG環境変数の内容でも確認できる
ja_JP.UTF8  ……現在のロケールは日本語UTF8 
user01@PC001:~$



●ロケールを英語に切り替える(恒久的に切り替える)

 Bash on Ubuntu on Windowsのデフォルトのロケールは、インストールしたWindows OSのロケール設定に基づいて自動的に設定されている。日本語版Windows 10上にインストールすれば「ja_JP.UTF8」に、英語版Windows 10にインストールすれば「en_US.UTF8」にそれぞれ設定されている。

 bashのデフォルトのロケール設定を変更するにはupdate-localeコマンドを使って、「sudo update-locale <ロケール名>」のようにして変更する(sudoは管理者権限で実行するためのコマンド)。ロケール指定では、ja_JPやen_USの大文字/小文字はこの通りにすること(UTF8の部分は小文字でもよい)。

 利用可能なロケール名の一覧は「locale -a」コマンドで取得できる。

user01@PC001:~$ locale -a   ……利用可能なロケールの一覧を表示させる
……一番シンプルなロケール指定。表記が短いのでよく使われるが、日本語ファイル名などがうまく表示されないので利用には注意
C.UTF-8
POSIX
en_US.utf8  ……英語UTF8 
ja_JP.utf8  ……日本語UTF8。現在のデフォルト 
user01@PC001:~$ update-locale LANG=en_US.UTF8  ……sudoなしでupdate-localeを実行しようとしている
コマンド 'update-locale' は '/usr/sbin/update-locale' で利用できます
'/usr/sbin'がPATH環境変数に含まれていないためコマンドを特定できませんでした。
大抵の場合、お使いのユーザーアカウントに管理者特権がないことが原因です。
update-locale: コマンドが見つかりません  ……エラーとなって実行できない
user01@PC001:~$ sudo update-locale LANG=en_US.UTF8  ……先頭にsudoを付けて実行してみる
sudo: ホスト PC001 の名前解決ができません  ……名前解決のための設定が行われていない場合に表示されるメッセージ。無視するか、後述のTIPSの方法で対策しておく
[sudo] password for user01:
user01@PC001:~$ cat /etc/default/locale  ……変更後の内容を確認してみる
#  File generated by update-locale
LANG=en_US.UTF8  ……英語UTF8のロケールに変更されている
user01@PC001:~$ exit ……ここでいったんbashを終了させて再起動すること



 ロケールの変更後はいったんbashを終了してから、再起動する(Windowsのシステムそのものの再起動は不要)。すると以後はずっと変更されたロケールが使用されることになる。

 元に戻すには「sudo update-locale LANG=ja_JP.UTF8」を実行してから、bashを再起動する。

 なお、途中のsudoコマンドの実行で名前解決のエラーが発生する場合は(「sudo: ホスト XXXXX の名前解決ができません」というようなメッセージが表示される)、以下のTIPS中の「●[事前準備]sudoで名前解決エラーが出ないように、ホスト名を設定する」を参照して、あらかじめホスト名を登録しておくこと。

●ロケールを一時的に英語にする

 ロケールのデフォルト値を変更するのではなく、あるコマンドだけロケールを変更して実行したいのなら、コマンドの先頭に「LANG=<ロケール名> 」(変数LANGの内容を変更するコマンド)を付けて実行する。この指定と、実行するコマンドの間は空白文字で区切る。「;」などで区切ると(2つのコマンドに分割されて)別の意味になる(LANGの値が変更されたままになる。「ロケールを以後のセッション内ではずっと英語にする」参照)。

user01@PC001:~$ ls -la  ……まず日本語モードでlsを実行してみる
合計 16
drwxr-xr-x 2 user01 user01    0 10月 13 13:41 .  ……時刻表示などが日本語表記になっている
drwxr-xr-x 2 root   root      0  1月  1  1970 ..
-rw------- 1 user01 user01 3504 10月 13 13:42 .bash_history
-rw-r--r-- 1 user01 user01  220 10月 13 11:03 .bash_logout
-rw-r--r-- 1 user01 user01 3637 10月 13 11:03 .bashrc
-rw------- 1 user01 user01   80 10月 13 13:18 .lesshst
-rw-r--r-- 1 user01 user01  675 10月 13 11:03 .profile
user01@PC001:~$ LANG=en_US.UTF8 ls -la  ……英語ロケールにしてlsコマンドを実行させる
total 16
drwxr-xr-x 2 user01 user01    0 Oct 13 13:41 .  ……時刻表示が英語表記になっている
drwxr-xr-x 2 root   root      0 Jan  1  1970 ..
-rw------- 1 user01 user01 3504 Oct 13 13:42 .bash_history
-rw-r--r-- 1 user01 user01  220 Oct 13 11:03 .bash_logout
-rw-r--r-- 1 user01 user01 3637 Oct 13 11:03 .bashrc
-rw------- 1 user01 user01   80 Oct 13 13:18 .lesshst
-rw-r--r-- 1 user01 user01  675 Oct 13 11:03 .profile
user01@PC001:~$ date  ……もう1つの例。まずは何も付けずにdateコマンドを実行する
2016年 10月 13日 木曜日 13:44:14 DST  ……日本語表示
user01@PC001:~$ LANG=en_US.UTF8 date  ……英語UTF8ロケールでdateを実行
Thu Oct 13 13:44:17 DST 2016  ……英語表示
user01@PC001:~$



 ロケール名を指定する際、「LANG=en_US.UTF8 〜〜」ではなく「LANG=C 〜〜」とすることがよくある。「LANG=C」だと、アプリケーションの持つ文字列などがそのまま翻訳されずに表示される(表記が短いというメリットがある)。だがこれだと、日本語ファイル名などが正しく表示されないことがあるので、その場合は「LANG=en_US.UTF8 〜〜」とするとよいだろう。

●ロケールを以後のセッション内ではずっと英語にする

 1つのコマンド実行時だけでなく、以後のbashセッション内ではずっと英語モードにしたければ、「LANG=<ロケール名>」を単独で実行する。

user01@PC001:~$ date  ……日本語ロケールのまま実行
2016年 10月 13日 木曜日 14:02:17 DST  ……日本語表示
user01@PC001:~$ LANG=en_US.UTF8  ……英語UTF8ロケールに切り替える
user01@PC001:~$ date  ……ロケール指定なしで同じコマンドを実行する
Thu Oct 13 14:02:27 DST 2016  ……英語表示になっている
user01@PC001:~$ echo $LANG  ……ロケール設定を確認する
en_US.UTF8  ……英語ロケールになっている
user01@PC001:~$



 こうやって変更したLANG変数はどこにも保存されていないので、bashを終了すると消えてしまう。そしてbashを次回起動した場合は、また元のロケールが使用される。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。