skillup

技術ブログ

PHP

ロケール情報について

投稿日:

本日、csvファイルを読み込む処理を行っていたんですが、コンソールからコマンドを打つと化けずに、ウェブ上で見ると化けるという現象が発生。

csv,プログラムともに文字コードがutf8で統一していることは確認しています。

いろいろ調べたところapacheの起動時にロケール情報がおそらく不正確ということでプログラムの冒頭に上記の設定をいれたら解決しました。

以前にもやった処理でしたが、理解を深くしていなかったため、これを機に調査。

ロケール情報とは?

OSが持っている多言語対応の仕組みのようです。OSが提供していますので、環境により若干変わりこれがコンソールから打った時とapacheで動かしたときの文字化けの有無かと思います。

PHPは文字列の扱いなどが統一されておらず各関数ごとに規格がバラバラのようです。

  • 文字エンコーディングを仮定せず、文字列をバイト列とバイトオフセットで扱う関数(substr, strposなど)
  • 内部エンコーディングに従うか、または引数で文字エンコーディングを指定する関数(htmlentities, mbstring関数全般)
  • ロケール設定に従う関数(本稿の話題、strcasecmpなど)
  • UTF-8など特定の文字エンコーディングを前提とする関数(u修飾子利用時のPCRE関数など)

上記のようにバラバラなため、内部の文字エンコーディングを統一しても化けることがあります。fgetcsvはロケール依存のようです。

そのため、このロケールを統一してあげないと化けることになります。※今回は発生しませんでしたが、ロケールにja_JP.UTF-8がないこともあるようです。

その場合、追加をすることになります。※リンク参照

参考リンク

PHPロケールに関するまとめ

公式 setlocale

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

-PHP
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

cakePHPの認証-Authコンポーネント

ひさびさにPHPをやる機会があり、短期での開発だったため、cakePHPを使いました。 以前やったことがあったんですが、もう2年以上たっていますね。 といいつつも昔のソースを見ながらやることで思い出し …

no image

POP3を使ったメール受信

メールの送信と比べると、プログラムで描く頻度は少ないですが、メールの受信について。 Contents1 POP3サーバー2 プログラムにてPOP3サーバーと通信3 PHPにてメールを取得する場合 PO …

no image

CakePHP3でのコレクションに関して

プログラミングにおいて基礎となるのは配列、ハッシュの処理とオブジェクト指向の使いこなしです。 配列、ハッシュの処理に関しては自前でメソッドを書いてもよいですが、バグの温床になりやすいので、ライブラリを …

no image

composer最低保証のバージョンを管理

自分の開発端末ではPHPのバージョンが7.1何ですが、上げなければいけないサーバーのバージョンが7.0だったりして、

みたいなエラーが …

no image

cakePHPでの直SQL

今回はCakePHPにて直のSQLを書く方法を。 cakePHPにて大概の処理はもともと備わっているコマンドでなんとかなりますが、まれに直SQLを書いたほうがらくなこともあります。 書き方その1 [c …