プロが教えるわが家の防犯対策術!

PHP文字コードの不思議!?
さくらインターネットでは問題なかったものがヘテムルに移行すると起こりました。
PHPにてcsvを読み込んで表示しています。

[ csv ]
01,りんご
02,orange
03,orangeりんご
04,りんごorange

というよな、csvファイルを読むと・・・

01 りんご→何も表示されない
02 orange→orange
03 orangeりんご→orangeりんご
04 りんごorange→orange

化けることはないですが日本語が表示されず、
しかし冒頭が欧文の場合、続きの日本語は表示されます。
(日本語をあなどとすると正常に表示します)
csv、php、共にUTF-8で作成しています。

さくらでは起こらなかった現象ですが・・・
php.iniなど特にさわっておりません。
どう対処すればよいでしょうか???

A 回答 (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関数でカンマで区切ってやればよいのではないでしょうか。
    • good
    • 0

既に対処しているようですが、原因を潰しておかないと他の部位にも影響が


あるかもしれません。

>> さくらインターネットでは問題なかったものがヘテムルに移行すると起こりました。
>> -<中略>-
>> php.iniなど特にさわっておりません。
>> どう対処すればよいでしょうか???

ソースもphp.iniも変更していないのなら、サーバー側の違いとなります。
今回の現象は、サーバーOS上のロケール設定の違いの可能性が高いです。
ロケールが原因ならsetlocale関数でさくらと同じロケールに設定するだけです。
    • good
    • 0
この回答へのお礼

最初に試したのがそのsetlocale関数でした。
setlocale(LC_ALL, 'ja_JP');
としたところ日本語は表示されましたが、一部が文字化けしました。

"さくらと同じに"とのことですが、
どのようにして調べればよいのでしょうか??
setlocaleについて教えていただければ幸いです。。

お礼日時:2010/06/16 23:42

>PHPにてcsvを読み込んで表示



どうやって読みこんでるか書かないと解決策も何も・・・
まずはphpinfoでmbstringの状況を確認した方がいいですね
あとはサーバー側にiconvの設定を確認するとか
    • good
    • 0
この回答へのお礼

おっしゃるとおりです。
コードが無いと分からないですよね。

http://www.phppro.jp/qa/371
上記URLでなんとか自己解決できました!

以下引用
>fgetcsv はバイナリセーフとなっていますが、
>日本語を含む CSV のパースは自分で行ったほうが無難です。
>$csvdata = fgetcsv($csvfile, 1000);
>を
>$csvdata = explode(',', trim(fgets($csvfile, 1000)));
>に置き換えてみてください。

fgetcsv ではなく explode で処理するとすんなりいけました。
これはどういう違いがあるのでしょう。
何故 explode だとうまくいくのか???

お礼日時:2010/06/16 16:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!