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 じゃ効かないみたいなの注意)