たけまるの日記

たけまるの日記です。web関係の技術ネタが多いですが、好きなことを適当に書いています。

PHPのfgetcsv()がsetlocaleしてもダメな時にやるべきたった一つの事

釣りタイトルがうまく付けられません。


さてタイトル通りなのですが、PHPのfgetcsvがうまく動かない場合があり、大抵の場合は

setlocale(LC_ALL,'ja_JP.UTF-8');

等と予め記述すれば動きます。(CSVファイルがUTF-8の場合)


ただ今回、これではダメなケースにぶち当たりました。
そもそもsetlocale()は返り値として成功時に現在のロケール値を、失敗時にfalseを返すのですが、今回は見事にこれがfalseとなっておりました。

このsetlocaleに設定する値はOSに依存するのですが、とりあえずOSが持ってるlocale一覧を表示してみます。(環境はCentOS6)

# locale -a
C
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
POSIX


見事に「ja_JP.UTF-8」がありません。
OSにそもそも「ja_JP.UTF-8」が認識されていないので、setlocale()しても失敗していたのです。

OSに「ja_JP.UTF-8」を追加するために以下のコマンドを実行します。

# localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
# locale -a
C
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
ja_JP.utf8
POSIX


これで追加されました。

apacheを再起動する必要があるようでしたので行います。
再度PHPからsetlocale()を実行すると成功し、fgetcsv()も想定通りの動きをしてくれました。


めでたしめでたし。



ちなみになんでこんな事になったかというと、開発環境作るのに使ったVagrantの野良box↓

https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box

が、見事に英語しか入ってない状態だったからのようです。

普通にCentOSやらを日本語でインストールしたり、日本のレンタルサーバーやらだったらこんな事は起きないと思われます。