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

SQSのキュー登録とworkコマンドに関して

SQSでのキューの登録に関して以前やりましたが、再度扱うことがあったので、調査を。 リンク SQSについて Queueの登録と実際の処理に関して Contents1 キューの登録2 キューの監視 キュ …

no image

cakeでのトランザクション、コミット、ロールバック

cakePHP(2.X系)でのトランザクション、コミット、ロールバックについて。 cakePHPでトランザクションを書ける場合、Model内に [crayon-5f704ef9d7bc99404378 …

no image

phpの時分秒+cakePHPのupdate

ちょっと小ネタ集になります。 Contents1 PHPで秒→時分秒変換2 cakePHPでのupdate PHPで秒→時分秒変換 PHPで秒数から時分秒に変換するプログラムです。 汎用的かなと思った …

no image

cakePHP3での複数データベース接続

cakePHP3で複数のデータベースに接続することができます。 まず設定ファイルで複数のデータベースを定義します。(defaultはそのままにしておきます。) [crayon-5f704ef9d897 …

no image

laravelでの名前空間変更

laravelでの名前空間変更について。 laravelでモデルの場所はディフォルトだとapp/直下に作られます。 これをapp/Modelというディレクトリを作ってnamespaceを正常に定義した …