Bash on Ubuntu on Windowsで日本語を使うと文字化けすることがある。ロケールを英語に変更して文字化けを避ける方法を解説する。
対象OS:Windows 10バージョン1607以降(64bit版のみ)
Windows 10のバージョン1607(Anniversary Update)で導入された「Bash on Ubuntu on Windows」はまだベータ版のためか(原稿執筆時点)、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 ……一番シンプルなロケール指定。表記が短いのでよく使われるが、日本語ファイル名などがうまく表示されないので利用には注意
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を次回起動した場合は、また元のロケールが使用される。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.