PHPのロケール、又はアパッチの環境変数 LANG

PHPにて、コマンドラインを使いたかった。引数をエスケープするのに escapeshellarg() を使ったのだけど、日本語のところが剥ぎ取られてしまった、英数字(それと少しの記号文字)しか残らない。調べてみると、PHPロケールの設定に合わない文字は通さないという事の様だ。

PHPロケール

それで PHPロケールの設定なんだけど、 setlocale(LC_CTYPE, 0) で訊いてみたら「C」だった。(LC_CTYPE についてはマニュアル参照、escapeshellarg() は文字の変換としてこの定数が対応する模様)

で、どうしようか。
PHPプログラム中で「setlocale(LC_CTYPE, 'ja_JP.UTF-8')」と書くのかな、というかこの「C」の値ってどっから来たんだっけ。

アパッチの環境変数 LANG

phpinfo() に依ると、最後の方 Environmentセクションに「LANG C」とある、そこから来てるわけだ。この環境変数はどうしてるんだっけ。
Apache的には SetEnvディレクティブで明示的にセットするというやり方もあり得るが、今度はその設定を何処に書くかという話になる。

/etc/apache2/envvars

ちょっと探したんだけど、Debian 6.0 (codename “squeeze”) では /etc/apache2/envvars で設定していた(grep -r LANG /etc/apache2)。
前述 Environmentセクションにある環境変数は基本的にここで値を与えられているようだ。LANG 関係は

## The locale used by some modules like mod_dav
export LANG=C
## Uncomment the following line to use the system default locale instead:
#. /etc/default/locale

export LANG

文中、初め「the following line」の意味がよく分からなかった、二度目の export文既に Uncomment になってると。直後の default locale 行の事ですね、そうすると default locale を読み、もう一度 LANG を export する。
まあ、そっち方面じゃなくて、ここで明示的にロケールを指定することにしましょう。

export LANG=ja_JP.UTF-8

そしてアパッチ restart 。(reload じゃ効かないみたいなの注意)