Linuxのlocaleがおかしくなっていた

突然プログラムが起動しなくなったため、
原因を探ったところ、localesが壊れていました。
そのため、再インストールすることで直りました。
言語取得部分は動くけど、おかしい結果を返す壊れ方のため、
発見にわりと手間取りました。

まとめ

  • プログラム上でlocaleを参照する部分がおかしい結果を返す
    • 常にANSI_X3.4-1968
    • Debian 7.8
  • dpkg-reconfigure localesが何か壊れているメッセージを出す
    • localeをアップデートすると直る
    • apt-get install locales

localeの取得がおかしい

pythonではgetpreferredencoding()で設定されている言語情報を取ってこれます。 ですが、
LANG='ja_JP.UTF-8' echo 'import locale; print locale.getpreferredencoding()' | python
を実行しても、ANSI_X3.4-1968が返ってきてしまい、日本語処理の部分でおかしくなっていました。
(前にそのプログラムは動いていたので、気がついたらおかしくなっていました)

localeを実行してみたところ、以下のように表示されました。

locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.UTF-8
POSIX

どうやら日本語のlocaleが有効ではないようです。

ですが、/etc/locale.genでは、ja_JP.UTF-8がコメントアウトされていて有効になっていました。

原因は不明だがとりあえず直る

sudo su
export LC_ALL=C # jaは使えないのでCにする必要がある
export LANG=C # jaは使えないのでCにする必要がある
sudo dpkg-reconfigure locales

したら、localesが壊れているというメッセージが出てきました。

そのため、

apt-get install locales
sudo dpkg-reconfigure locales

で、ja_JP.UTF-8を有効にしてリブートしたら上手くいくようになりました。

おそらくlocales周りがおかしくなっており、新しいlocalesを入れる際にそれが直ったのだと思います。