
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など特にさわっておりません。
どう対処すればよいでしょうか???
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関数でカンマで区切ってやればよいのではないでしょうか。
No.2
- 回答日時:
既に対処しているようですが、原因を潰しておかないと他の部位にも影響が
あるかもしれません。
>> さくらインターネットでは問題なかったものがヘテムルに移行すると起こりました。
>> -<中略>-
>> php.iniなど特にさわっておりません。
>> どう対処すればよいでしょうか???
ソースもphp.iniも変更していないのなら、サーバー側の違いとなります。
今回の現象は、サーバーOS上のロケール設定の違いの可能性が高いです。
ロケールが原因ならsetlocale関数でさくらと同じロケールに設定するだけです。
最初に試したのがそのsetlocale関数でした。
setlocale(LC_ALL, 'ja_JP');
としたところ日本語は表示されましたが、一部が文字化けしました。
"さくらと同じに"とのことですが、
どのようにして調べればよいのでしょうか??
setlocaleについて教えていただければ幸いです。。
No.1
- 回答日時:
>PHPにてcsvを読み込んで表示
どうやって読みこんでるか書かないと解決策も何も・・・
まずはphpinfoでmbstringの状況を確認した方がいいですね
あとはサーバー側にiconvの設定を確認するとか
おっしゃるとおりです。
コードが無いと分からないですよね。
http://www.phppro.jp/qa/371
上記URLでなんとか自己解決できました!
以下引用
>fgetcsv はバイナリセーフとなっていますが、
>日本語を含む CSV のパースは自分で行ったほうが無難です。
>$csvdata = fgetcsv($csvfile, 1000);
>を
>$csvdata = explode(',', trim(fgets($csvfile, 1000)));
>に置き換えてみてください。
fgetcsv ではなく explode で処理するとすんなりいけました。
これはどういう違いがあるのでしょう。
何故 explode だとうまくいくのか???
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- PHP PHP ページング データベース 1 2022/06/16 10:30
- PHP 文字列を段落で分ける方法を教えて下さい。 2 2023/03/09 10:03
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- 邦楽 シングルの話 1 2022/07/06 23:05
- その他(メールソフト・メールサービス) メールソフトを教えてください 1 2023/03/28 23:32
- MySQL MySQL,JavaScript,PHPコードの結果を表示する方法を教えてください。 1 2023/02/13 17:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA セル塗りつぶし
-
AccessのVBAで、パラメータを使...
-
EXCEL2010でRGB指定できない
-
【エンコード関係?】マルチバイ...
-
MsgBoxの中にある数字や日付の...
-
NTBackUpの設定
-
$_SERVER["PHP_SELF"]などでURL...
-
バーチャルPCはusb2.0が使えま...
-
adobeのflashplayer20_a_instal...
-
dairect3Dの初期化に失敗
-
起動やシャットダウンの時刻に...
-
Debian Linux Squeeze 6.xx
-
CPU使用率が100%で貼りつきまし...
-
Wardなどの読み上げソフト
-
初心者です プライマリ、セカ...
-
VMware PlayerでPlayonlineは表...
-
LGA1156対応Core i7、Core i5は...
-
ダウンロードの禁止
-
タスクのサービス設定が反映さ...
-
「RT-200KI」でWiiをネットにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VBA】計算結果に小数点第2位...
-
MsgBoxの中にある数字や日付の...
-
VBA 条件付き書式で空欄は適用...
-
VBA コンボボックスの表示(日...
-
クリスタルレポートの改ページ...
-
POIを使った書式設定
-
マイナス記号を▲で表す方法
-
spread6.0(セル連結)
-
チェックボックスのある行を非...
-
C#にて、他言語にローカライズ...
-
Format関数について
-
syntax error, unexpected $end...
-
NTBackUpの設定
-
MSAccessでODBCを介してDB接続...
-
PDTのデバッグツール、
-
エクセルのメモについて教えて...
-
条件付き書式について
-
16進数の文字列を普通の文字列...
-
FORMAT関数で値が変わる
-
日曜日始まりのボックス型の万...
おすすめ情報