• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHP文字コードの不思議!?)

PHP文字コードの不思議!?

このQ&Aのポイント
  • さくらインターネットでは問題なかったものがヘテムルに移行すると起こる現象について、PHPにてcsvファイルを読み込んで表示すると日本語が表示されない問題が発生します。
  • csvファイルを読み込むと、欧文の場合は正常に表示されるが、日本語が含まれる場合は表示されない現象が発生しています。
  • さくらでは起こらなかった現象であり、php.iniなどの設定にも特に問題はないため、対処方法を求めています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

fgetcsv関数は、ローケルを考慮するので、 setlocale(LC_ALL, 'ja_JP'); としてローケルを日本語に合わせたのだと思いますが、文字コードも合わせる必要があるのではないでしょうか。(サーバの内部コードがEUCとかになってそう) setlocale(LC_ALL, 'ja_JP.UTF-8'); ちなみにfgetcsv関数は、単純にCSVの一行を配列にして読み込むというだけではなく、 Excelなどが吐き出すようなCSV、 例) 1,2,"test,asdfada",aaaa,"aaaa bbbb" このようなものを、 array( 0 => 1, 1 => 2, 2 => "test,asdfada", 3 => "aaaa", 4 => "aaaa\nbbbb", ) というように読みだします。 そのため文字コードなど考慮する必要があり、ローけるの設定や文字コードの設定が重要になります。 explode関数に関しましては、単純に、第一引数で指定された区切り文字で文字列を区切って配列にするものになります。 なので、文字コードを考慮せず単純に切るだけだから文字化けも発生しません。 今回の質問者さんの作成されているCSVデータは、上記の例のような、複雑なものではないのであれば fgets関数で一行読み出して、その一行をexplode関数でカンマで区切ってやればよいのではないでしょうか。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

既に対処しているようですが、原因を潰しておかないと他の部位にも影響が あるかもしれません。 >> さくらインターネットでは問題なかったものがヘテムルに移行すると起こりました。 >> -<中略>- >> php.iniなど特にさわっておりません。 >> どう対処すればよいでしょうか??? ソースもphp.iniも変更していないのなら、サーバー側の違いとなります。 今回の現象は、サーバーOS上のロケール設定の違いの可能性が高いです。 ロケールが原因ならsetlocale関数でさくらと同じロケールに設定するだけです。

tkmkok
質問者

お礼

最初に試したのがそのsetlocale関数でした。 setlocale(LC_ALL, 'ja_JP'); としたところ日本語は表示されましたが、一部が文字化けしました。 "さくらと同じに"とのことですが、 どのようにして調べればよいのでしょうか?? setlocaleについて教えていただければ幸いです。。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>PHPにてcsvを読み込んで表示 どうやって読みこんでるか書かないと解決策も何も・・・ まずはphpinfoでmbstringの状況を確認した方がいいですね あとはサーバー側にiconvの設定を確認するとか

tkmkok
質問者

お礼

おっしゃるとおりです。 コードが無いと分からないですよね。 http://www.phppro.jp/qa/371 上記URLでなんとか自己解決できました! 以下引用 >fgetcsv はバイナリセーフとなっていますが、 >日本語を含む CSV のパースは自分で行ったほうが無難です。 >$csvdata = fgetcsv($csvfile, 1000); >を >$csvdata = explode(',', trim(fgets($csvfile, 1000))); >に置き換えてみてください。 fgetcsv ではなく explode で処理するとすんなりいけました。 これはどういう違いがあるのでしょう。 何故 explode だとうまくいくのか???

すると、全ての回答が全文表示されます。

関連するQ&A