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
が、見事に英語しか入ってない状態だったからのようです。