- 締切済み
PHP 全角文字が文字化けまたは表示されない
PHPでエクセルで作成したcsvファイルから商品一覧を表示させたいのですが。 一覧ページで日本語や大文字英数が含まれるデータが表示されません。 エンコードはいろいろ試してみたのですが、utf-8だと文字化け、EUC_JPやSJISだと表示されなくなってしまいます。 csvから呼び出す際に mb_convert_variables('utf-8', 'sjis-win', $tmp); としても文字化けします。 ちなみに、$dataでprintすると問題なく表示されます。 $data1では上手く表示されません。 なので、for($i=$start;$i<$end;$i++){ 以降でおかしいんだろうなとは思うのですが。 1ページに数件ずつで、次へ次へで移りたいので、ここの部分が必要です。 商品詳細ページで、同じcsvファイルを読みだしてますが、 while ($data = fgetcsv($fp, 10000)) { if($atai==$data[0]){ ・・・・ と書いてこちらは問題なく表示できています。 何が原因か見つけられずに困っています。 お分かりになる方、教えてください。 初心者レベルですので、なるべく具体的に書いていただけると助かります。 よろしくお願いします。 //ファイルからデータを読み込む処理 function inst_view($page=0) { //読み込むファイル名 $filename = FILE_PATH; //データ数をカウントする $row = 0; $data = array(); //CSVファイルの中身をすべて読み込む $handle = fopen($filename, "r"); while (($tmp = fgetcsv($handle, 1000, ",")) !== FALSE) { if (!empty($choice1) && $choice1 == "4") { $num = count($tmp); if( $tmp[0] == "" ){ }else{ $data[$row]["no"] = $tmp[0]; $data[$row]["hito"] = $tmp[1]; $data[$row]["kuni"] = $tmp[2]; $data[$row]["tochi"] = $tmp[3]; $data[$row]["nen"] = $tmp[4]; $data[$row]["size"] = $tmp[5]; $data[$row]["cm"] = $tmp[6]; $row++; } } } fclose($handle); //降順にする rsort($data); //1ページに表示するデータ数を読み込む $page_length = PAGE_LENGTH; //全ページ数を求める処理 $maxpage = $row/$page_length; $tmp = (int)$maxpage; if($maxpage>$tmp){$maxpage=$tmp+1;} $maxpage--; //現在のページ数からデータ開始と終わりを求める $start = $page * $page_length; $end = ($page * $page_length) + $page_length; //データを格納する配列と、その指標 $cnt=0; $data1 = array(); //データ格納処理(スタートからエンドまで繰り返す。 for($i=$start;$i<$end;$i++){ //最大データ数を超えたら取得終了する。 if($i >= $row){break;} $data1[$cnt]["no"] = $data[$i]["no"]; $data1[$cnt]["hito"] = $data[$i]["hito"]; $data1[$cnt]["kuni"] = $data[$i]["kuni"]; $data1[$cnt]["tochi"] = $data[$i]["tochi"]; $data1[$cnt]["nen"] = $data[$i]["nen"]; $data1[$cnt]["size"] = $data[$i]["size"]; $data1[$cnt]["cm"] = $data[$i]["cm"]; $cnt++; } return $data1; } 別のファイルからinst_viewを呼び出しています。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- toppojeejo
- ベストアンサー率0% (0/0)
>mb_convert_encoding($data0, 'UTF-8', 'shift-jis'); mb_convert_encoding($data0, 'UTF-8', 'SJIS-win'); で試されてはいかがでしょうか? 私は逆のパターンでしたが上手くいきました
Excelで作ったやつは「shift-jis」じゃなくて「cp932」ですね。改行コードはCRLFでもLFでもちゃんと動いてくれるようなのでそのままにすると… setlocale(LC_ALL, 'ja_JP.UTF-8'); stream_filter_prepend($fp = fopen(FILE_PATH, 'rb'), 'convert.iconv.cp932/utf-8', STREAM_FILTER_READ); while ($tmp = fgetcsv($fp)) { ... } これでどうでしょうか。「...」の部分でechoとかvar_dumpしてるなら最初に header('Content-Type: text/html; charset=utf-8'); もしくは header('Content-Type: text/plain; charset=utf-8'); を実行するのを忘れずに。
補足
ありがとうございます。 教えていただいたページも見て、いろいろ試しているのですが、解決に至りません。 $file = FILE_PATH; $data0 = file_get_contents($file); $data0 = mb_convert_encoding($data0, 'UTF-8', 'shift-jis'); $temp = tmpfile(); $data = array(); fwrite($temp, $data0); rewind($temp); setlocale(LC_ALL, 'ja_JP.UTF-8'); while (($tmp = fgetcsv($temp, 0, ",")) !== FALSE) { としたら、だいぶ表示されるようになったんですが、ひらがな・カタカナ・空白が1文字目にあると1文字目だけ化けてしまいます。 ほとんどの漢字、アルファベットは大丈夫なんですが。 上記のように書き換えたら、1文字目文字化け以外は解決しています。