ls
コマンドが文字化けする原因を調べてみた。原因は3通りあるようだ。
原因:1 言語関連の環境変数がおかしい
言語関連の環境変数がおかしいと、日本語はハテナマーク(?
- question mark)に化ける。
解決法
多くの場合は下記のコマンドを実行すると解決する。
export LANG='ja_JP.UTF-8'
これで直らない、または「なぜ」を知りたい場合は続きへ。
言語関係の環境変数(ロケール)とは?
言語関連の環境変数とはロケールを設定するための変数である。ロケール (locale) は言語や文化ルールの集合である。
現在のロケールはlocale
コマンドで確認できる。
重要な変数は以下の表にまとめた。
変数名 | 役割 |
---|---|
LANG |
未設定の変数に対するデフォルト |
LC_COLLATE |
ソートする際の順序 |
LC_CTYPE |
バイト列の扱い |
LC_MESSAGES |
システムのメッセージ |
LC_TIME |
時刻と日付 |
LC_ALL |
すべての設定を上書きする |
環境変数の優先順位
各変数には優先順位がある。
強さはLANG
<LC_○○
<LC_ALL
になっている。
lsで使う環境変数
ls
コマンドはLC_CTYPE
で制御される。
export LC_CTYPE='ja_JP.UTF-8'
環境変数の強さを考えて再設定する
LC_CTYPE
を設定しても文字化けが直らないことがある。なぜならLC_ALL
に値が設定されていると、ほかの変数をすべて無視してLC_ALL
の値を使用するからだ。
この場合はLC_ALL
の値を未設定に戻してやる必要がある。
unset LC_ALL export LC_ALL
原因:2 日本語フォントが入っていない
日本語のフォントが存在しない場合、日本語は四角い記号(■
)などに化ける。
俗にいう豆腐化である。
解決法
日本語フォントを入れて、ターミナルのフォントに設定することで解決する。
いまどき日本語フォントの入っていないPCを使っていること自体考えられないので、日本語フォントを入れただけで解決する望みは低い。
原因:3 ターミナルが日本語を扱えない
環境変数を正しく設定して日本語のフォントをインストールしたのに文字化けするときは、ターミナルが日本語に対応していない。
この場合の文字化けは四角い記号になったり、複雑な漢字の羅列になったりとさまざまである。
マルチバイト文字を扱えないターミナルエミュレータといえば、シリアルコンソール(GUI無しでインストールしたLinux)である。
解決法
マルチバイト文字を正しく扱えるターミナルを使用する。
WindowsならTera Term、Macならデフォルトのターミナル、その他Unix系OSならxtermなどを使えばよい。