phpの日本語が四角に文字化けする問題

このQ&Aのポイント
  • PHPでテキストファイルの検索結果をソートして出力するスクリプトで日本語が四角に文字化けする問題が発生しています。
  • 配列データの全体を表示すると、日本語も正しく表示されますが、要素を指定して出力すると日本語が四角になってしまいます。
  • ご教授の程、よろしくお願いいたします。
回答を見る
  • ベストアンサー

phpの日本語が□(四角)に文字化けします。

PHPでテキストファイルの検索結果をソートして出力するスクリプトで文字化けが出て困って います。 テキストファイル------------------ 20101225|第二会議室|1200|1300|就職面接 20101225|第一会議室|1300|1400|打ち合わせ 20101225|第一会議室|1500|1600|テスト 20101225|第一会議室|0900|1000|会議 20101225|第一会議室|1200|1300|休憩 20101224|第一会議室|1200|1500|クリスマス会 スクリプト(抜粋)--------------------- //$_GET["year"]) = 2010; //$_GET["title"]) = "第一会議室"; //$_GET["month"] = 12; //$_GET["day"] = 25; foreach ($schedule_list as $lineno => $line) { list($schedule_date, $title, $str_time, $end_time, $body) = explode("|", $line); if ($schedule_date == date("Ymd", mktime(0, 0, 0, $_GET["month"], $_GET["day"], $_GET["year"])) && $title == $_GET["title"]) { //抽出結果を配列に格納 $data[] = array( 'sch_date'=>$schedule_date ,'title'=>"$title", 'str'=>$str_time, 'end'=>$end_time, 'body'=>"$body", 'no'=>$lineno); } } //開始時間(昇順)でソート //array_multisort($str, SORT_ASC, $end, $sch_date, $title, $body, $no, $data); foreach ($data as $key => $row) { $sch_date[$key] = $row['sch_date']; $title[$key] = $row['title']; $str[$key] = $row['str']; $end[$key] = $row['end']; $body[$key] = $row['body']; $no[$key] = $row['no']; } 表示結果(1)---------------------  print_r($data);  配列データの全体を表示すると、日本語も正しく表示されます。 Array ( [0] => Array ( [sch_date] => 20101225 [title] => 第一会議室 [str] => 1300 [end] => 1400 [body] => 打ち合わせ [no] => 1 ) 表示結果(2)---------------------  print_r($sch_date[0]); print_r($title[0]); print_r($str[0]); print_r($end[0]); print_r($body[0]); print_r($no[0]);  配列データの要素を指定して出力すると日本語が□になります。  20101225�13001400�1 以上、どなたかご教授下さい。 日付   会議室 開始時間 終了時間 使用者 20101225 �     1300    1400   �

  • PHP
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

んー、多分。。。本当に多分程度の考えですけど、print substr($body[0] , 0 , 1); って書いても 同じように � が表示されるかもしれないんじゃないかな。。と思います。 print_r($body[0]); を print $body[0]; にしてみてください。 なんーか、たしか、文字列を配列のように表示しようとすると、こんな事が起きるんじゃなかったかな~とか、思ったり思わなかったり。 例えば、$str = "hoge"; を print $str[2]; ってやると、g が表示されたような されなかったような。 とっても、アバウトですみません。

naga4973
質問者

お礼

bm_hiroさん 早速の回答ありがとうございます。 配列にあまり詳しくないもので、参考になります。 print $body[0]; にしても□になってしまいした。 最後に全てprintで出力しているのですが、 配列の扱い方に問題があるのですかねー。 出力ソース-------------- for( $i=0 ; $i<count( $data ) ; $i++ ) { print("<tr>\n"); print("<td>$sch_date[$i]</td>\n"); print("<td>$title[$i]</td>\n"); print("<td>$str[$i]</td>\n"); print("<td>$end[$i]</td>\n"); print("<td>$body[$i]</td>\n"); } ■こんな感じになってしまいます。TT  20101225 � 1300 1400 �  20101225 � 1500 1600 �  20101225 � 0900 1000 �  20101225 � 1200 1300 � ■ちなみに使用している文字コードはUTF-8(下記) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ■CSSはこんな感じです。(下記) <style type="text/css"> a:link {color: #3366FF; background-color: transparent; text-decoration: none; font-weight: bold;} a:visited {color: #2B318F; background-color: transparent; text-decoration: none; font-weight: bold;} a:hover {color: #00BFFF; background-color: transparent; text-decoration: underline;} body {color: #333333; background-color: #FFFFFF;} table {border: 1px solid #CCCCCC; border-collapse: collapse; margin-bottom: 1em;} td {border: 1px solid #CCCCCC; height: 2.5em; vertical-align: middle; padding-left: 1em; padding-top: 2px; padding-right: 1em; padding-bottom: 2px;} th {border: 1px solid #CCCCCC; color: #333333; background-color: #F0F0F0; padding: 5px;} </style>

関連するQ&A

  • 文字化けが解決できません。お願いします

    文字化けが解決できません 使用データベースはSQLServer2008です 対象カラムはcharです データベースの照合順序はJapanese_CI_ASです ブラウザのエンコードをUTF-8にするとprint_r($row);の部分は文字化けせずに表示 されますprint("砂糖");は文字化けします ブラウザの標準文字コード??SJISだとprint_r($row);文字化けします print("砂糖");は文字化けしません ということはSQLServerのデータの文字コードがUTF-8ということなのでしょうか SJISだと思うのですが。 そこで、SQLServerがUTF-8だと仮定してprint_r(mb_convert_encoding($row, "SJIS","UTF-8")); というプログラムを書いたのですが結果は同じでブラウザのエンコードをSJISにすると 文字化けしていまいます どうすればブラウザのエンコードがSJISで文字化けしないようになるのでしょうか 教えてください。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift-SJIS"> <title>test</title> </head> <body> <?php try{ $dsn ='sqlsrv:server=.\sqlexpress;database=sample'; $dbname = "sample"; $user = "sa"; $password ="manager"; //$dbh = new PDO("mssql:host=.\\SQLEXPRESS;dbname=sample",$user,$password); $dbh = new PDO($dsn,$user,$password); $stmt = $dbh->prepare("select * from shohin"); $stmt->execute(); while($row = $stmt->fetch()){ //print_r($row); //print_r(mb_convert_encoding($row, "SJIS","UTF-8")); print_r($row); } unset($dbh); unset($stmt); // foreach($dbh -> query($sql) as $row) // print($row["id"]); // print($row["name"]); // echo "接続できました"; // } // $dbh = null; print("砂糖"); }catch(PDOException $e){ print("Failed to get DB handle:aaakkka".$e->getMessage()."\n"); phpinfo(); exit(); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • 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を呼び出しています。

    • 締切済み
    • PHP
  • PHPとMySQLの文字化けの対応法は?

    OSはWinXPで、MySQL+PHPのアプリを作成しているところです。 <html> <head><title>配列データの取得</title></head> <body> <table border="1"> <tr><td>題名</td><td>著者</td><td>出版社</td></tr> <?php $host = "localhost"; if (!$conn = mysql_connect($host, "user", "pass")){ die("MySQL接続エラー.<br />"); } mysql_select_db("kisop", $conn); $sql = "SELECT * FROM book_table LIMIT 10"; $res = mysql_query($sql,$conn); while($row = mysql_fetch_array($res)) { print("<tr>"); print("<td>".$row["btitle"]."</td>"); print("<td>".$row["bauth"]."</td>"); print("<td>".$row["bpub"]."</td>"); print("</tr>\n"); } mysql_free_result($res); ?> </table> </body> </html> と、こんな演習をしているのですが、ブラウザに表示させると文字化けしました。 HTML文はEUC、MySQLのデータは、シフトJISで入っていたようです。 そのため、「題名」「著者」などの見出しと、取り出したデータを同時に文字化けさせずに、表示できない 状態です(泣)。 MySQLからデータを取り出すときに、mb_convert_encodingで文字コードを変換してやれば 化けないでしょうが、出力しようとするデータのすべてを変換しなければなりません。 プログラマーさんたちは、文字化けの現象について、どう対応されているのでしょうか? いちいち、mb_convert_encodingで、変換しているものなのでしょうか? 定石のようなものを知りたいところです。 たとえば、HTML文は文字コード○○を使うものだ、設定ファイルを書き換えておく、などなど。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • MYSQLとPHPによって取得する多次元配列

    はじめてご質問させていただきます。 現在以下のようなテーブルが3つあります。 [ tbl1 ] | tbl1Key | title | | 1 | a | | 2 | b | | 3 | c | | 4 | d | [tbl2] | tbl2Key | tbl1Key | tbl3Key | | 1 | 2 | 2 | | 2 | 3 | 1 | | 3 | 3 | 4 | | 4 | 1 | 3 | [tbl3] | tbl3Key | value | | 1 | aaa | | 2 | bbb | | 3 | ccc | | 4 | ddd | 上記のデータソースを元に以下のような結果を得たいと考えています。 array( array( 'tbl1Key'=>1, 'title'=>'a', 'values' => array( array( 'tbl3Key'=>3, value='ccc' ) ), array( 'tbl1Key'=>2, 'title'=>'b', 'values' => array( array( 'tbl3Key'=>2, value='bbb' ) ), array( 'tbl1Key'=>3, 'title'=>'c', 'values' => array( array( 'tbl3Key'=>1, value='aaa'), array( 'tbl3Key'=>4, value='ddd' ) ), array( 'tbl1Key'=>4, 'title'=>'d', 'values' = > array( array( 'tbl3Key'=> , value='' ) ) ) この場合phpによって $sql = ("select * from `tbl1`"); $res = mysql_query( $sql, $con ); $data = array(); while( $row =mysql_fetch_object( $res ) ) { $sql = ("select * from `tbl3` inner join `tbl2` on `tbl3`.`tbl3Key`=`tbl2`.`tbl3Key` where `tbl2`.`tbl1Key`={$row->tbl1Key}"); $res2 = mysql_query( $sql, $con ); $tmp = array(); while( $r = mysql_fetch_object( $res2 ) ) { $tmp[] = $r->value; } $row->values = $tmp; $data = $row; } まずtbl1のデータをすべて取り、配列dataに格納する段階で、tbl1と関連付けされたtbl3のvalueを取得し配列tblに格納、それを新しい要素として配列dataにプッシュしている状況です。 こういったテーブルでいうところの1カラムのみ配列で返すような事は、こういったループを使って以外にも可能なのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPの掲示板について

    下記のソースコードを実行したところページは表示されるのですが 記事を書き込み画像を添付して送信することができませんでした。 どのように修正すればいいでしょうか <?php $con = pg_connect("dbname=postgres user=postgres password=postgres"); if ($_POST['write']) { $name = get_form($_POST['name']); if (strlen($name) > 100) exit(); if (!$name) $name = "名無しさん"; $title = get_form($_POST['title']); if (strlen($title) > 100) exit(); if (!$title) $title = "無題"; $contents = get_form($_POST['contents']); if (strlen($contents) > 500) exit(); if (!$contents) error("本文を入力してください"); $delkey = get_form($_POST['delkey']); $expire = time() + 3600 * 24 * 30; setcookie("name", $name, $expire); setcookie("delkey", $delkey, $expire); $tname = $_FILES['image']['tmp_name']; if ($tname) { if (!is_uploaded_file($tname)) error("不正なアップロード"); $type = $_FILES['image']['type']; if ($type != "image/jpeg" && $type != "image/pjpeg") { error("JPEG形式ではありません"); } $rs = pg_query($con, "select last_value from pgbbs3_no_seq"); $no = pg_fetch_result($rs, 0, 0) + 1; $path = "image/$no.jpg"; move_uploaded_file($tname, $path); $path_t = "image/{$no}_t.jpg"; list($sw, $sh) = getimagesize($path); $dw = 128; $dh = $dw * $sh / $sw; $src = imagecreatefromjpeg($path); $dst = imagecreatetruecolor($dw, $dh); imagecopyresized($dst, $src, 0, 0, 0, 0, $dw, $dh, $sw, $sh); imagejpeg($dst, $path_t); } pg_query($con, "insert into pgbbs3(name,title,contents,delkey) values('$name','$title','$contents','$delkey')"); } else { $name = $_COOKIE['name']; $delkey = $_COOKIE['delkey']; } if ($_POST['delete']) { $no = get_form($_POST['no']); $delkey = get_form($_POST['delkey']); $rs = pg_query($con, "delete from pgbbs3 where no=$no and delkey='$delkey'"); if (pg_affected_rows($rs) == 0) error("記事削除に失敗しました"); } // フォームの文字列を取得する function get_form($str) { $str = pg_escape_string(htmlspecialchars($str)); $str = ereg_replace("\n|\r|\r\n", "<br>", $str); return $str; } // エラー表示して終了 function error($msg) { print "<p><font color='red'>$msg</font></p>\n"; exit(); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>画像アップロード掲示板</title> </head> <body> <p>JPEGファイルのみアップロードできます。</p> <form method="post" action="pgbbs3.php" enctype="multipart/form-data"> お名前:<input type="text" name="name" value="<?php print $name ?>"><br> 題 名:<input type="text" name="title"><br> <input type="hidden" name="max_file_size" value="30000"> 画像:<input type="file" name="image"><br> 削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"><br> <textarea name="contents" cols="60" rows="5"></textarea><br> <input type="submit" name="write" value="送信"> </form> <hr> <form method="post" action="pgbbs3.php"> 記事番号:<input type="text" name="no"> 削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"> <input type="submit" name="delete" value="記事削除"> </form> <?php $rs = pg_query($con, "select * from pgbbs3 order by no desc"); while ($row = pg_fetch_array($rs)) { $time = substr($row['time'], 0, 19); $no = $row['no']; print "<hr>No.{$no} <strong>{$row['title']}</strong>"; print " 投稿者:{$row['name']} 投稿日時:$time"; $fn = "image/{$no}.jpg"; $fn_t = "image/{$no}_t.jpg"; if (file_exists($fn)) print "<br><br><a href='$fn'><img src='$fn_t' border='0'></a>"; print "<br><br>{$row['contents']}\n"; } pg_close($con); ?> </body> </html>

    • 締切済み
    • PHP
  • getがらphpに日本語を送ったとき化け文字に

    <?php ・・・・・・・・ $mousikomi_hi1 = $_GET["mousikomi_hi1"]; $name =$_GET["name"];// "田中"; $sql = "SELECT $mise.kokyaku_no FROM $mise WHERE name='$name' AND DATE_FORMAT(mousikomi_hi1,'%Y/%m/%d') ='$mousikomi_hi1'"; mysql_query("set names utf8"); $rows = mysql_query($sql, $sv) or die("mysql query Error"); $row = mysql_fetch_array($rows, MYSQL_ASSOC); ・・・・・・・・・ ?> var mousikomi_hi1 = $F("mousikomi_hi1"); var name = document.addE.name4.value; //alert(name); xhrObj.open("get", "add_meigara.php?hannbaitenn="+hannbaitenn+"&mousikomi_hi1="+mousikomi_hi1+"&name="+name); getがらphpに日本語を送ったとき $name =$_GET["name"] に化け文字?(□/□□)になり SQLの検索ができません 直接 $name = "田中";とすると 検索できます 初心者で、あまりわかりませんが、よろしくお願いします。

    • 締切済み
    • PHP
  • 日本語のデータが文字化けをしてしまいます。

    PHP初心者です。 レンタルサーバでdatファイルに書き込んでる情報をPHPファイルで出力すると、日本語の部分が文字化けしてしまいます。 datファイルから読み込んでいない日本語の部分はちゃんと表示されています。 また、datファイルにはちゃんと日本語のデータになっています。 文字コードはEUC、 PHPの出力はSJIS。 これはどういうことでしょうか? どなたか教えて下さい。 ソースは以下3ファイル構成↓ <入力するデータを集めるファイル> <html> <body> <h1 style="background:#cccccc">ゲストブック(書き込み)</h1> <form method="POST" action="guest_write.php"> お名前: <input type="text" name="name" size="20" maxlength="30" /><br /> メッセージ: <input type="text" name="message" size="70" maxlength="255" /><br /> <input type="submit" value="送信" /> </form> </body> </html> <入力したデータをdatに書き込むファイル> <?php $file=fopen("guest.dat","a"); flock($file,LOCK_EX); $line =date("Y年 m月d日 H:i:s")."\t"; $line.=$_POST['name']."\t"; $line.=$_POST['message']."\t"; fputs($file,$line."\n"); flock($file,LOCK_UN); fclose($file); header("Location: guest_input.php"); ?> <datファイルから読み込んで出力するファイル> <html> <body> <h1 style="background:#cccccc">ゲストブック(閲覧)</h1> <?php $file=fopen("guest.dat","r"); while($row=fgetcsv($file,1024,"\t")){ ?> <ol> <li>お名前:<?php print($row[1]); ?></li> <li>メッセージ:<?php print($row[2]); ?></li> <li>書き込み日時:<?php print($row[0]); ?></li> </ol> <hr /> <?php } fclose($file); ?> </body> </html> 以上ですが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでMySQLのデータを2次元配列に格納する

    PHPの本に $r = mysql_query("SELECT * FROM tb;"); while ($row = mysql_fetch_array($r)){ print "{$row['id']}{$row['title']}<BR>"; } とあったのですが1行ずつしか保存できないので 2次元配列row[][]で while ($row[] = mysql_fetch_array($r)){ } foreach($row as $v){ print "{$v['id']}{$v['title']}<BR>"; } このようにコーディングしたところ 一応うまく表示されたのですが、問題はないですか? もし普通はこういう風にするみたいなやり方があれば 教えて欲しいです。

    • ベストアンサー
    • PHP
  • PHPロジックで・・・

    PHP4をHTMLに埋め込むロジックを書いてます。 DBはpostgresqlです。 <? print("<SELECT NAME=sendgroup>"); print("<option value=name>グループ一覧"); for($i = 0; $i < row; $i++){ $str = pg_result($res,$i,0); print("<option value=$str>$str"); } print("</SELECT>"); ?> DBから取り込んだデータをrow(行数)分まわして HTMLのセレクトオプション表示をしたいのですが 表れません。$strにDBから取り込んだデータが 入ってます。 普通にprint($str)データの値はちゃんととれています。 HTMLのselect文でなにか規約があるのでしょうか?

    • 締切済み
    • PHP
  • 文字化けが発生する

    MySQL4.1をデフォルト設定のまま使っています(UTF-8) phpMyAdminで、UTF-8の2バイト文字を登録し、参照するときちんと表示されるのですが、自分で作ったPHPスクリプトからデータを参照すると、「??????????」と完全に文字が壊れて表示されてしまいます。 PHPでは普通に $query = 'select * from table'; $result = mysql_query($query); while($row = mysql_fetch_array($result){ print_r($row); } とやっています。どこがおかしいのでしょうか?

    • ベストアンサー
    • MySQL

専門家に質問してみよう