本日、csvファイルを読み込む処理を行っていたんですが、コンソールからコマンドを打つと化けずに、ウェブ上で見ると化けるという現象が発生。
csv,プログラムともに文字コードがutf8で統一していることは確認しています。
いろいろ調べたところapacheの起動時にロケール情報がおそらく不正確ということでプログラムの冒頭に上記の設定をいれたら解決しました。
1 |
setlocale(LC_ALL, 'ja_JP.UTF-8'); |
以前にもやった処理でしたが、理解を深くしていなかったため、これを機に調査。
Contents
ロケール情報とは?
OSが持っている多言語対応の仕組みのようです。OSが提供していますので、環境により若干変わりこれがコンソールから打った時とapacheで動かしたときの文字化けの有無かと思います。
PHPは文字列の扱いなどが統一されておらず各関数ごとに規格がバラバラのようです。
- 文字エンコーディングを仮定せず、文字列をバイト列とバイトオフセットで扱う関数(substr, strposなど)
- 内部エンコーディングに従うか、または引数で文字エンコーディングを指定する関数(htmlentities, mbstring関数全般)
- ロケール設定に従う関数(本稿の話題、strcasecmpなど)
- UTF-8など特定の文字エンコーディングを前提とする関数(u修飾子利用時のPCRE関数など)
上記のようにバラバラなため、内部の文字エンコーディングを統一しても化けることがあります。fgetcsvはロケール依存のようです。
そのため、このロケールを統一してあげないと化けることになります。※今回は発生しませんでしたが、ロケールにja_JP.UTF-8がないこともあるようです。
その場合、追加をすることになります。※リンク参照