csvファイルを読み込む際に文字化けが発生する問題の解決方法

このQ&Aのポイント
  • PHPでCSVを読み込んで名簿を作成していますが、一部の文字が文字化けしてしまいます。原因と解決方法について教えてください。
  • CSVファイルを読み込む際に文字化けが発生しました。プログラムやファイルの文字コードの設定を確認し、適切な文字コードに変換することで問題を解決することができます。
  • PHPでCSVを読み込んで名簿を作成していますが、一部の文字が正しく表示されません。文字コードの設定や文字変換に問題がある可能性があります。正しい文字コードを設定し、文字変換を行うことで解決することができます。
回答を見る
  • ベストアンサー

phpで読み込んだcsvが文字化けします

PHPでCSVよ読み込んで名簿を作っています。 出力まではうまくいったのですが、なぜか一字だけ文字化けしてしまいます。(「務」→「冶」になってしまいます) 普段あまりプログラムはしないので、原因がわからず困りはてております。よろしくお願いいたします。 PHP部分の記述は以下になります。 ――――――――――――――――――――――――――――――――――― <?php $fname = "csv/meibo.csv"; $file = fopen($fname, "r"); $nowrap = "nowrap=\"nowrap\""; $tcent = "class=\"center\""; $tbg = "class=\"even\""; while (list($name, $post, $add, $add2, $tel, $http, $url, $mail) = fgetcsv($file, 1000, ",")){ $name = strtr($name, "﨑", "崎"); $add2 = strtr($add2, "﨑", "崎"); $tline ++; if($tline % 2 == 0){ echo "<tr $tbg>\n"; }else{ echo "<tr>\n"; } echo "<td $nowrap>$name</td>\n"; echo "<td $tcent>$post</td>\n"; echo "<td>$add<br />$add2</td>\n"; echo "<td $tcent>$tel</td>\n"; if($http == "http://"){ echo "<td $tcent><a href=\"$http$url\" target=\"_blank\"><img src=\"img/common/img_hp.gif\" alt=\"HPへ\" width=\"16\" height=\"16\" /></a></td>\n"; } else { echo "<td $tcent>&nbsp;</td>\n"; } echo "<td>$mail</td>\n"; echo "</tr>\n"; } fclose($file); ?> ――――――――――――――――――――――――――――――――――― PHP4を利用。 .phpのcharsetはShift_JISで、同じくShift_JISで保存しています。 CSVファイルはエクセルで作りShift_JISで書き出しています。

noname#146582
noname#146582
  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • koke29
  • ベストアンサー率58% (114/196)
回答No.1

理由はわかりませんが $name = strtr($name, "", "崎"); が引っかかってるっぽいです $name = str_replace( "", "崎",$name); または $name = strtr($name, array("" >= "崎")); これだとちゃんと「務」で表示されました

noname#146582
質問者

お礼

koke29様、ありがとうございます! PHP4だからダメなのかなと、PHP5の環境もつくって試してみたのですが、今度はさらに文字化けしてまた一苦労していました。 ずっとエンコードの問題だと思っていたのですが、文字置換の部分が影響していたのですね。

その他の回答 (1)

  • koke29
  • ベストアンサー率58% (114/196)
回答No.2

あああ… なんか文字が消えてしまう… "" は "サキの難しいやつ" です。

noname#146582
質問者

お礼

立の崎は、いろいろ扱いが難しいみたいですね。 補足ありがとうございます!

関連するQ&A

  • PHPでCSVファイルのデータを表示したところ日本語が表示されません

    PHPで、CSVファイルの中身を表示させようと思ったのですが、一部の日本語が正しく表示されません。 問題のPHPとCSVファイルの内容を明記します。アドバイスお待ちしております。 PHP <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>tokuten</title> </head> <body> <TABLE border="1"> <TBODY> <TR> <TD>ID</TD> <TD>名前</TD> <TD>点数</TD> </TR> <?php $fname = "name.csv"; $fp = fopen($fname, "r"); while (list($id, $name, $point) = fgetcsv($fp, 100, ",")) { echo"<TR>"; echo"<TD>".$id; echo"</TD>"; echo"<TD>".$name; echo"</TD>"; echo"<TD>".$point; echo"</TD>"; echo"</TR>"; } fclose($file); ?> </TBODY> </TABLE> </body> </html> CSV 1,a,50 2,b,70 3,c,100 55,松井,55 530000,フリーザ,530000

    • 締切済み
    • 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
  • PHPで問い合わせフォーム 受信すると文字化けする

    フォーム⇒ (1)確認  ⇒ (2)送信 と3つに分けて、phpファイルに書きました。 ためしに、送信してみると、成功はするものの、文字が化けてメールの内容が分かりません。 分からないので教えてください。 フォーム ↓ <form method="POST" action="kakunin.php"> <table border="0"> <tr> <td >お名前</td> <td><input type="text" name="name" size="20"></td> </tr> <tr> <td>メールアドレス</td> <td><input type="text" name="from" size="20"></td> </tr> <tr> <td>メールタイトル</td> <td><input type="text" name="title" size="20"></td> </tr> <tr> <td>メッセージ</td> <td><textarea rows="5" name="naiyou" cols="40"></textarea></td> </tr> <tr> <td colspan="2"><input type="submit" value=" お問い合わせ内容を確認 "></td> </tr> </table> </form> (1) kakunin.php ↓ 入力フォームから情報を受け取り確認 <?php // フォームの値を取得します。 if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k => $v){ // 「magic_quotes_gpc = On」のときはエスケープ解除 if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); } // 値をチェックします。 $ErrFlg = 0; if ($name == "") { echo "<p>お名前を入力してください。"; $ErrFlg = 1; } if ($from == "") { echo "<p>メールアドレスを入力してください。"; $ErrFlg = 1; } if ($title == "") { echo "<p>メールタイトルを入力してください。"; $ErrFlg = 1; } if ($naiyou == "" ) { echo "<p>メッセージを入力してください。"; $ErrFlg = 1; } if ($ErrFlg) { exit(); } ?> 内容を確認して送信ボタンをクリックしてください <form method="POST" action="mail.php"> <table border="0"> <tr> <td width="100">お名前</td> <td width="300"><?php echo $name?></td> </tr> <tr> <td width="100">メールアドレス</td> <td width="300"><?php echo $from?></td> </tr> <tr> <td width="100">メールタイトル</td> <td width="300"><?php echo $title?></td> </tr> <tr> <td width="100">メッセージ</td> <td width="300"><?php echo nl2br($naiyou) ?></td> </tr> <tr> <td colspan="2"><input type="submit" value="送信"></td> </tr> </table> <input type="hidden" name="name" value="<?php echo $name ?>"> <input type="hidden" name="from" value="<?php echo $from ?>"> <input type="hidden" name="title" value="<?php echo $title ?>"> <input type="hidden" name="naiyou" value="<?php echo $naiyou ?>"> </form> (2) mail.php ↓のコード 送信 <?php // メール送信先を指定します。 $to = "xxxxxxxxxx■ gmail.com"; // フォームの値を取得します。 if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k => $v){ // 「magic_quotes_gpc = On」のときはエスケープ解除 if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); } // メール本文を組み立てます。 $naiyou = "お名前:$name\n メールアドレス:$from\n タイトル:$title\n 内容:$naiyou\n"; if ($name != "" and $from != "" and $title != "" and $naiyou != "" ) { if (mb_send_mail($to, $title, $naiyou, "From:$from")) { echo "メールを送信しました"; } else { echo "メール送信失敗です"; } } ?>

    • ベストアンサー
    • PHP
  • php文字化けについての質問

    <TABLE BORDER> 99表 <tr> <th> </th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th> </tr> <tr> <?php for ($i = 1; $i <= 9; $i++ ) { echo "<tr>\n"; echo '<th>'. $i ."</th>\n"; for ($j = 1; $j <= 9; $j++ ) echo '<td>'. $i * $j."</td>\n"; echo "</tr>\n"; } ?> </table> 表と言う文字が文字化けして???と表示されます phpの設定も何度も見直しているのですが 問題がが発見できません どなたかお教えください

    • ベストアンサー
    • PHP
  • CSVデータベース

    PHPを使い CSVのデータを表示させる事ができました。 がっ見た目がどうも汚いですよね・・・ もっとすっきりする方法はあるんでしょうか? あとCSVのデータを検索させるようにしたいのですが何かサンプルとかありませんでしょうか? 注文多くて申し訳ないですが、是非ともご教授よろしくお願い致します。 <table width="550" class="table01"> <tr> <td width="32" height="18"><div align="center"><strong>画像</strong></div></td> <th width="123"><strong>情報1</strong></th> <th width="58"><strong>情報2</strong></th> <th width="56"><strong>情報3</strong></th> <th width="53"><strong>情報4</strong></th> <th width="55"><strong>情報5</strong></th> <th width="56"><strong>情報6</strong></th> <th width="81"><strong>対象</strong></th> </tr> <?php $csv = fopen ("./data/new.csv", "r") or die(print "ファイルを開く事が出来ませんでした"); while ($items = fgetcsv ($csv, 1000,",")) { print "<tr>\n"; print "<td height='40' rowspan='2'><img src='$items[0]'/></td>\n"; print "<td><center>$items[1]<center></td>\n"; print "<td>$items[2]</td>\n"; print "<td>$items[3]</td>\n"; print "<td>$items[4]</td>\n"; print "<td>$items[5]</td>\n"; print "<td>$items[6]</td>\n"; print "<td>$items[7]</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td height='16' colspan='7'><div align='left'>$items[8]</div></td>\n"; print "</tr>\n"; } fclose($csv); ?> </table>

    • ベストアンサー
    • PHP
  • Noのデータ受け渡しで同じNoが表示されてしまうのは何故!?

    formdb_search.php 一覧表示させるphpです。 echo "<TR>\n"; echo "<FORM method=\"post\"action=\"./formdb_modify.php\">\n"; echo "<INPUT type=\"hidden\" name=\"data_no\" value=\"".$data_array[0]." \">\n"; echo "<TD nowrap><INPUT type=\"submit\" value=\" 詳細\"></TD>\n"; echo "<TD nowrap>" . $data_array[0] . "</TD>\n"; echo "<TD nowrap>" . $data_array[1] . "</TD>\n"; echo "<TD nowrap>" . $data_array[2] . "</TD>\n"; echo "<TD nowrap>" . $data_array[3] . "</TD>\n"; echo "<TD nowrap>" . $data_array[4] . "</TD>\n"; echo "<TD nowrap>" . $data_array[5] . "</TD>\n"; echo "<TD nowrap>" . $data_array[6] . "</TD>\n"; echo "</FORM>\n"; echo "</TR>\n"; //データ表示件数を1加算 $data_view++; } ?> <TR> <TH nowrap>詳細</TH> <TH nowrap>No.</TH> <TH nowrap>公開日</TH> <TH nowrap>求人の概要</TH> <TH nowrap>業界</TH> <TH nowrap>規模</TH> <TH nowrap>上場区分</TH> <TH nowrap>募集職種</TH> </TR> </TABLE> formdb_modifyのphpで、詳細を選択したNo.を表示するPGです。 // データファイルから1行ずつ配列として読込み $data_all = file("../../db/csv/maillog.csv"); //データ取得処理 for($i=1; $i < count($data_all);$i++){ // データを以下の配列として取得 // $data_array[0] - No. // $data_array[1] - 公開日 // $data_array[2] - 求人の概要 // $data_array[3] - 業界 // $data_array[4] - 規模 // $data_array[5] - 上場区分 // $data_array[6] - 募集職種 $data_array = explode(",",$data_all[$i]); $data_no = $_POST['data_no']; if($data_no == $data_no){ $kyujin=$data_array[0]; $koukai=$data_array[1]; $gaiyou=$data_array[2]; $gyoukai=$data_array[3]; $kibo=$data_array[4]; $kubun=$data_array[5]; $shokushu=$data_array[6]; $poji=$data_array[7]; $nenrei=$data_array[8]; $seibetsu=$data_array[9]; } } ?> <HTML> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=SHIFT_JIS"> <TITLE>データ詳細</TITLE> </HEAD> <BODY> <DIV align="center"> <H1>データ詳細 No.<?php echo $_POST['data_no'] ?></H1> <A href="./mail.html">求人案件情報登録へ</A> <A href="./formdb_search.php">求人案件一覧へ</A> <FORM method="post" action="<?php echo $PHP_SELF ?>"> <INPUT type="hidden" name="set" value="modify"> <INPUT type="hidden" name="data_no" value="<?php echo $data_no ?>"> <?php> $data_no = 0; ?> <TABLE align="center" cellpadding="10"> <TR align="left"> <TD>求人No.</TD> <TD><INPUT type="text" name="kyujin" size="20" value="<?php echo $kyujin ?>"></TD> </TR> 何故かどのNo.の詳細を選択しても同じNo.の詳細データが表示されてしまうのですが... 教えて下さい。

    • 締切済み
    • PHP
  • CSV読み込みの数制限

    CSVを読み込み表示について質問です。 CSVのデータは全部で35件あり読み込む順番に$hyoujijyunの配列に 値をいれています。 やりたいことは1ページ目(view.php?page=1)に配列の先頭から18個の データを表示させそれ以降は2ページ目(view.php?page=2)へ表示させ それぞれのページに次のページへ飛ぶリンクと前へ戻るリンクを表示 したいと思っているのですがこの場合どのようにすればいいの でしょうか? for文を使えばいいのかな?と思い考えてみたのですが応用の方法が わからずです^^; 現状は以下のソースです。hyoujijyunの値が全て表示されています。 if (! $fp = @fopen("data.csv" ,"r")) { print "ファイルを開けません!"; exit(); } while (($filedata= fgetcsv($fp, 10000, ",")) !== FALSE) { $datas[]= $filedata; } fclose($fp); $hyoujijun = array (2, 10, 18, 27, 21, 28, 23, 20, 13, 1, 7, 14, 12, 5, 11, 35, 29);// 並びに規則性はなく実際には35個の値が入る foreach($hyoujijun as $row) { echo "<tr>\n"; echo "<td>{$datas[$row][0]}</td>\n"; echo "<td>{$datas[$row][3]}</td>\n"; echo "<td class=\"{$datas[$row][2]}\">{$datas[$row][3]}</td>\n"; echo "<td>{$datas[$row][4]}</td>\n"; echo "<td>{$datas[$row][5]}</td>\n"; echo "<td>{$datas[$row][6]}</td>\n"; echo "<td>{$datas[$row][7]}</td>\n"; echo "<td>{$datas[$row][8]}</td>\n"; echo "<td>{$datas[$row][9]}</td>\n"; echo "<td colspan=\"3\">{$datas[$row][10]}</td>\n"; echo "</tr>\n"; }

    • 締切済み
    • PHP
  • PHP+mySQLでのCSV→DB登録で文字化けします

    現在タブ区切りのCSVファイルをPHPで取り込み mySQLへINSERTするものを作ろうとしているのですが INSERTするモノに全角が入ると文字化けているせいか mysql_queryでFALSEが帰ってきてしまいます。 使用環境、コードを以下に書きます。 どこかおかしな点等ありましたらご教授お願い致します。 OS:windowsXP PHP:Ver5.2.6、default_charset UTF-8 mysql:Ver5.0.51a UTF-8 取り込みたいCSV:Shift_JIS,CRLF,タブ区切り コード(一部) while(!feof($fp)){ $buf = fgets($fp); $buf = mb_convert_encoding($buf, "UTF-8", "Shift_JIS"); $buf=str_replace('\r\n', '\n', $buf); $array = preg_split("/\t/", $buf); if($array[0] == "") { break; } else { //INSERT用に加工( $values = replaceValues($array); } $sql = "INSERT INTO table_name VALUES($values)"; $res = mysql_query($sql); if(!$res){ echo "登録に失敗しました。"; echo "sql:".$sql; mysql_close($conn); exit; } $cnt++; }

    • 締切済み
    • PHP
  • 画像の保存についての質問です。

    ----get_bk_img.php---- ・・・・・ ・・・・・ <table width="740" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td> <a href="../index.html">TOP PAGE</a><br><br> <strong>保存する物件の写真を設定してください</strong><br> <?php $add_temp = $_FILES['up_fl']['tmp_name']; $add_name = $_FILES['up_fl']['name']; $add_type = $_FILES['up_fl']['type']; echo "temp:[".$add_temp."]<br>\n"; echo "name:[".$add_name."]<br>\n"; echo "type:[".$add_type."]<br>\n"; /*------------------------*/ /* -- データベース接続 -- */ /*------------------------*/   ・・・・・・・・   ・・・・・・・・   ・・・・・・・・ /*------------------------*/ /* -- データベース切断 -- */ /*------------------------*/ mysql_close($db); ?> <table width="740" border="1" cellpadding="15" bordercolor="#333333" align="center" cellspacing="0"> <form name=form1 method=post action=get_bk_img.php> <tr> <td bgcolor="#00CCFF">ファイル選択</td> <td bgcolor="#FFFFFF"> <input type=file name=up_fl value=""> <input type=hidden name=action value=hozon> <input type=hidden name=no value="<?php print($_POST['no']) ?>" > <input type=submit value="保存"> </td> </tr> </form> </table> <br> <table width="740" border="1" cellpadding="15" bordercolor="#333333" align="center" cellspacing="0"> <form name="form1" method="post" action="get_bk_img.php"> <tr> <td bgcolor="#00CCFF">保存ファイル一覧</td> <td bgcolor="#FFFFFF"> <select name="bu_file"> <?php print_r( $select_arr ) ?> </select> <input type="hidden" name="action" value="delete"> <input type="submit" value="削除"> </td> </tr> </form> </table> </table> </body> </html> としてるんですが、 echo "temp:[".$add_temp."]<br>\n"; echo "name:[".$add_name."]<br>\n"; echo "type:[".$add_type."]<br>\n"; の部分で表示されません。(値が空?) 書き方が間違ってますか?

    • ベストアンサー
    • PHP
  • fgetcsvでデータが何も表示されないのですが!?

    $data_all = fopen( "maillog.csv","r" ); while (($data_array = fgetcsv($data_all, 1000, ",")) !== FALSE) { $num = count($data_array); for($i=count($num)-1; $i>=1; $i--){ echo "<TR>\n"; echo "<FORM method=\"post\" action=\"./formdb_modify.php\">\n"; echo "<INPUT type=\"hidden\" name=\"data_no\" value=\"".$data_array[0]."\">\n"; echo "<TD nowrap><INPUT type=\"submit\" value=\" 詳細\"></TD>\n"; echo "<TD nowrap><FONT size=-1>" . $data_array[0] . "</FONT></TD>\n"; echo "<TD nowrap><FONT size=-1>" . $data_array[2] . "</FONT></TD>\n"; echo "<TD nowrap><FONT size=-1>" . $data_array[3] . "</FONT></TD>\n"; echo "<TD nowrap><FONT size=-1>" . $data_array[4] . "</FONT></TD>\n"; echo "<TD nowrap><FONT size=-1>" . $data_array[11] ."~" .$data_array[12]. "</FONT></TD>\n"; echo "<TD nowrap><FONT size=-1>" . $data_array[14] . "</FONT></TD>\n"; echo "</FORM>\n"; echo "</TR>\n"; //データ表示件数を1加算 $data_view++; } } fclose($data_all); 上記のプログラムを書いたのですが データが表示されないのです どう修正すれば良いのでしょうか?

    • 締切済み
    • PHP

専門家に質問してみよう