Microsoft Excel で編集した Shift_JIS の csv ファイルを PHP でパースする場合、
setlocale(LC_ALL, 'ja_JP.UTF-8')
してfgetcsv
で読み込みってのが常套手段なんだけど、これは Unix 環境では動くけど、Windows環境では動かない。いや、正確には PHP5までは動いていたんだけど、PHP7になってからは動かなくなってしまった。偶然動いていたのかも。ソースは追ってないからわからないけど。
そもそも、Windows では setlocale(LC_ALL, 'ja_JP.UTF-8')
は効かない。MSDNにも以下のように記述されている。
「UTF-7 または UTF-8 のコード ページ値を指定すると、setlocale は失敗し、NULL を返します。」
https://msdn.microsoft.com/ja-jp/library/x99tb11d.aspx
ということで、Windows でも Unix でも動くような Shift_JIS csvパーサは以下のようにしないとダメ。
https://gist.github.com/mgng/76061cdafa818d51a93b
開発環境は Windows、デプロイ先が Unix ってのは結構多いと思うから気をつけたい。