PHPでcsvファイルを読み込んでリストボックスに表示すると文字化けする問題の解決方法は?

このQ&Aのポイント
  • 現在、PHPからcsvファイルを読み込み、リストボックスに表示するプログラムを作成していますが、文字化けが発生してしまいます。
  • csvファイルとphpファイルのエンコードはutf8で保存されており、csvファイルは#区切りで記入されています。
  • mb_convertを使用しても文字化けの問題は解決できません。どのように解決すれば良いでしょうか?
回答を見る
  • ベストアンサー

PHP+csv+リストボックスで文字化け

お世話になっています。 現在PHPからcsvファイルを読み込み、リストボックスに表示するという、 単純なプログラムを組んでいます。 しかし、文字化けが発生してしまいます。 csvファイル、phpファイル共に、utf8での保存を確認しています。 csvファイルはイレギュラーですが、#区切りで記入されています。 csvファイル 1#商社マン 2#プロ野球選手 phpファイル --省略-- <HEAD> <META http-equiv=content-type content="text/html; charset=UTF-8"> </HEAD> --省略-- <?php function GyousyuList(){ $listFile = fopen('./conf/gyousyu.csv','r'); ?> <SELECT><?php while($itemLine = fgets($listFile)){ $itemList = explode('#',$itemLine); $itemId = mb_convert_encoding($itemLine[0],'UTF-8'); $itemName = mb_convert_encoding($itemLine[1],'UTF-8'); ?> <OPTION value=<?php echo $itemId;?>><?php echo $itemName;?></OPTION> <?php }?> </SELECT> <?php return; } ?> <?php GyousyuList();?> --省略-- 実行結果は日本語・英語にかかわらず文字化けします。 実行結果 抜粋 <SELECT> <OPTION value="ï">»</OPTION> <OPTION value="2">#</OPTION> </SELECT> どうにも解決できません。 ちなみにmb_convertは外しても結果は変わりませんでした よろしくお願いします!

noname#73526
noname#73526
  • PHP
  • 回答数1
  • ありがとう数1

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

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

magic_quotes_runtime 等のクォート関係の処理を有効にしたままにしていませんか? オフに出来ない事情があるのなら、stripslashes等の関数を通してクォート部分を取り除く前処理が必要です

noname#73526
質問者

お礼

お礼・締切が遅くなってゴメンなさい。 解決!とはなりませんでしたが、クオートの仕組みについて学ぶ良い機会になりました。ありがとうございました!

関連するQ&A

  • MySQLでの文字化けについて

    すいません、教えてください。 PHP(PHP-5.2.4)でCSVファイル を読み込んでMySQL(4.1.22)に INSERTしているのですが文字化けします。 SJIS→utf8_general_ciです。 いろいろ調べて ~ $wk[$i] =mb_convert_encoding($csvfile[$i],'UTF-8','SJIS-win'); ~ とかやってみたのですがうまくいきません。 どなたかよろしくお願いします。

    • 締切済み
    • PHP
  • PHP+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • php4、php5によるimplode()、file()の動作の違い?

    お世話になります。 SJISのファイルで、 //----コメント //あああ //--------------- あああ,いいいいいいいいいいいいい ううううう,えええええええええええええ のようなファイルを作成して $csv へこSJISファイルのファイルパスを設定し、 $FielList = mb_convert_encoding(@implode('', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("\r\n",$FielList); foreach($RowData as $Value) { $FName=trim($FName);$Cmnt=trim($Cmnt); echo '$FName='.$FName.'<br> $Cmnt='.$Cmnt.'<br>'; } と、その内容を見ると php5では、 $FName=//あああ $FName=//--------------- $FName=あああ $Cmnt=いいいいいいいいいいいいい $FName=ううううう $Cmnt=えええええええええええええ と、想定の結果が得られます。 しかし、php4だと、 $FName=//あああ//--------------- となってしまい、どうもcsvファイルの内容が\r\nにより仕切られて配列とならないようです。 そこで、 $FielList = mb_convert_encoding(@implode('###', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("###",$FielList); とすれば、php4,php5でも動作します。 また、 $FielList = mb_convert_encoding(@implode('', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("\n",$FielList); とすると、php4で予想の結果が返されますが、 php5では、echo で何も表示されなくなります。 ません。 php4、php5による \r\nの扱いの違い implode()の動作の違い file()の動作の違い だと思うのですが、どのように違うのかがわかりません。 このあたりのことをおわかりの方、 implode('###',@file(・・・ ) と記述しなくても implode('',@file(・・・ ) と記述することによりphp4、php5で同じように動作する方法がわからないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • phpのmb_convert_encodingで文字化け

    phpのmb_convert_encodingで文字化け phpでmb_convert_encodingを使用してSJISよりUTF-8にエンコーディングしています。 ところが、“(”や“?”などが1文字目に存在すると文字化けしてしまいます。 どのような原因が考えられますでしょうか? お願いいたします。

    • ベストアンサー
    • PHP
  • 文字コード(UTF-8)文字化けについて

    以下のphpを実行したところ、入力した文字によって文字化けしたりしなかったりします。 どなたか原因が分かる方がいらっしゃったら教えてください。 (見、一は化けない。上、実は化ける。) phpはバージョン5.2.8を使用しています。 (コード)----------------------- <html lang="ja"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8" /> <head> </head> </body> <?php mb_language("Japanese"); mb_internal_encoding("UTF-8"); $org_text1 = "見"; $org_text2 = "上"; $org_text3 = "実"; $org_text4 = "一"; $telop_text1 = mb_convert_encoding($org_text1,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text2 = mb_convert_encoding($org_text2,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text3 = mb_convert_encoding($org_text3,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text4 = mb_convert_encoding($org_text4,'utf-8','ASCII, JIS, EUC-JP,SJIS'); echo "telop_text1="; echo $telop_text1; echo "<br>"; echo "telop_text2="; echo $telop_text2; echo "<br>"; echo "telop_text3="; echo $telop_text3; echo "<br>"; echo "telop_text4="; echo $telop_text4; ?> </body> </html> (結果)------------------------- telop_text1=見 telop_text2= telop_text3=タ telop_text4=一

    • ベストアンサー
    • PHP
  • 「~」だけ 文字化けする。

    PHP初心者です。 フォームから入力された文字をテキストファイルに保存して、その保存されたテキストファイルを別ページで表示しています。 簡単なメモ帳みたいな感じです。 フォーム画面と入力完了画面は EUC-JPで、 表示している画面はUTF-8です。 表示画面で <ul> <?php $file = "hoge.txt"; $txt = file($file); foreach ($txt as $value){ $value = mb_convert_encoding($value,"utf-8"); echo "<li>".$value."</li>"; } ?> </ul> と記述しています。 全ての文字化けを確認したはけではないのですが、記述内容の 「~」の文字だけ変な文字になっています。 ここに貼り付けても上手く表示されてないのですが「〜」となっています。 何か原因分かる方おられましたら、アドバイスお願いします。

    • ベストアンサー
    • PHP
  • PHPでCSVデーターの表示について

    PHPでCSVデーターの表示について 教えてください。PHPでCSVデーターを表示したいのですが一覧表示ではなくテキストをクリックして特定のデーターを表示させようと考えております。 CSVデーターの中身(CSV.csv) 一郎,男,20歳 二郎,男,22歳 一子,女,24歳 二子,女,26歳 --data.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<p>',<a href="01.php">' . $name . '</a>','</p>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 一郎をクリックしたら一郎のデーターだけを(01.php)で表示させたいのですがよく分りません。 01.phpは今のところ一覧表示されるものを置いてあります。 --01.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<table border=1>'; echo '<tr>'; echo '<td>','名前','</td>'; echo '<td>'.$name.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','性別','</td>'; echo '<td>'.sex.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','年齢','</td>'; echo '<td>'.$age.'</td>'; echo '</tr>'; echo '</table>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 本を読んだり、ググったりしてヒントになる様な物を探しているのですが中々見つかりません。 初心者で申し訳ありませんが、どなたか教えていただけないでしょうか?

    • ベストアンサー
    • PHP
  • CSVファイルをダウンロードで文字化け

    こんにちは。 CSVファイルのダウンロードで文字化けを起こしていて困っております。 どなたか助けてくださる方がいらっしゃると大変光栄です。 機種:WindowsXP English ファイル:UTF-8 PHPコードは下記の通りです。 いろいろとHeaderを付けてみたり変えてみたりしましたが、どれも結果は同じでした・・。 Header("Accept-Ranges: none"); Header("Content-Transfer-Encoding: binary"); Header("Content-type: application/x-csv; charset=SJIS-win"); Header("Content-Disposition: attachment; filename=1.csv"); $output = '2007/08/29 こんばんわ'; print mb_convert_encoding($output,'SJIS-win','UTF-8'); アウトプットは下記の通りです。ダブルバイト全てが文字化けしてしまいます。 2007/08/29 ‚ア‚ñ‚ホ‚ñ‚í どなたか解決方法をご存知ないでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • phpのリストボックスについて

    よろしくお願いします。 phpを利用し、条件にあった内容を表示させる画面を作っています。 リストボックスで選択した内容を次のリストボックスの選択キーとして 別テーブルの検索条件に利用できるものでしょうか?? 以下のソースなんですが、 //------------------------------------------------------------- ソースA: print "<select name='brand' id='brand' style='width:190'>"; $sql ="select * from brand ORDER by no"; $res = mysql_query($sql); if ($res and mysql_num_rows($res)) { while($rec=mysql_fetch_array($res)){ echo "<option value='{$rec['name']}' >{$rec['name']}</option>"; } } print "</select>"; //-------------------------------------------------------------- とbrandテーブルからnameをリストボックス表示させます。 この表示し、選択した内容(仮にダイヤ)を同画面にあるもう一つの リストボックスで同じようなソースで別テーブルをselect文の検索キーに したいのです。以下のような感じ・・ //------------------------------------------------------------- ソースB: $sql ="select * from item where = 'ダイヤ'"; $res = mysql_query($sql); if ($res and mysql_num_rows($res)) { while($rec=mysql_fetch_array($res)){ echo "<option value='{$rec['itemname']}' >{$rec['itemname']}</option>"; } } print "</select>"; //-------------------------------------------------------------- の$sql ="select * from item where = 'ダイヤ'";←このダイヤを ソースAからもってきたいのですが、何かよい方法はありますか? 変数作ってやってみましたが、うまくいかずです。phpだけでは無理でしょうか?よろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう