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

form以外でのPOST送信

前回の記事に引き続きですが、APIを叩く側はformでデータを送るのではなく、コードの中にPOSTする処理を書きます。 選択肢としては curlコマンドを使う file_get_contentsを使う …

no image

PHP_CodeSnifferによるコードチェック

昨日の記事でphpmdという静的解析ツールを調査したんですが、それ以外にも規約にのっとっているかどうかコーディングをチェックできるツールはあります。 PHP_CodeSniffer https://g …

no image

PHPにおけるDI

Contents1 DIについての概要2 自分が作った簡単なサンプル(リンクの写経)3 参考リンク DIについての概要 PHPでのDI(Dependency Injection)に関して。 オブジェク …

no image

ファイルポインタ関連の操作に関して

CSVの読み込みに関してファイルポインタ関連で色々と整理することがあったのでメモ。 Contents1 今回やりたかった処理2 ファイルポインタとは 今回やりたかった処理 CSVファイルを読み込み(文 …

no image

php5.6のインストール+cake3でのbake

cake3を動かしたい場合、PHP5.4以上でないと動きません。 2016年1月現在、CentOS6でyumでPHPをインストールする場合、php5.3ですので、5.4以上を入れる場合、別のリポジトリ …