vorfee's Tech Blog

Just another tech blog

lsコマンドで日本語が文字化けする

lsコマンドが文字化けする原因を調べてみた。原因は3通りあるようだ。

原因:1 言語関連の環境変数がおかしい

言語関連の環境変数がおかしいと、日本語はハテナマーク(? - question mark)に化ける。

解決法

多くの場合は下記のコマンドを実行すると解決する。

export LANG='ja_JP.UTF-8'

これで直らない、または「なぜ」を知りたい場合は続きへ。

言語関係の環境変数ロケール)とは?

言語関連の環境変数とはロケールを設定するための変数である。ロケール (locale) は言語や文化ルールの集合である。

現在のロケールlocaleコマンドで確認できる。

重要な変数は以下の表にまとめた。

変数名 役割
LANG 未設定の変数に対するデフォルト
LC_COLLATE ソートする際の順序
LC_CTYPE バイト列の扱い
LC_MESSAGES システムのメッセージ
LC_TIME 時刻と日付
LC_ALL すべての設定を上書きする

環境変数の優先順位

各変数には優先順位がある。

強さはLANGLC_○○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 ターミナルが日本語を扱えない

環境変数を正しく設定して日本語のフォントをインストールしたのに文字化けするときは、ターミナルが日本語に対応していない。

この場合の文字化けは四角い記号になったり、複雑な漢字の羅列になったりとさまざまである。

マルチバイト文字を扱えないターミナルエミュレータといえば、シリアルコンソールである。

解決法

マルチバイト文字を正しく扱えるターミナルを使用する。

WindowsならTera Term、Macならデフォルトのターミナル、その他Unix系OSならxtermなどを使えばよい。

参照

  1. Man page of LOCALE
  2. [Techtalk] env LANG=C
  3. @IT:Fedora Core 1のコンソールで日本語を表示するには
  4. なぜなにUNIX「コンソールとターミナルの違いは?」:新刊ピックアップ|技術評論社