- ベストアンサー
MySQL文字化け問題
- MySQLの文字化け問題について解説します。
- MySQLとPHPを使用してカラオケの曲を番号で選択するプログラムを作成しましたが、文字化けの問題が発生しています。
- 文字化けを防ぐ方法や修正するための手順について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>お考えをお聞かせください。 見当がつきません。お役に立てず申し訳ありません。
その他の回答 (4)
- _kappe_
- ベストアンサー率68% (1581/2304)
回答No.1〜3の者です。 >私のプログラムの中に「文字を数値文字参照の形式に変換(渡→渡)している処理があり、加えてその中の&を&に置き換える処理がどこかにある」という事なのでしょうか? 誰かがどこかで数値文字参照の形式に変換しているはずと思っていますが、それが質問者さんのプログラムの中とは限りません。 提示されたものを眺めましたが、怪しい部分は見つけられませんでした。 自分だったら、どこの時点で変換されているのかを調べるためにデバッグ用出力をあちこちに埋め込んでみると思います。
お礼
何度もご回答を頂き、有難うございます。 お礼が遅れたことをお詫びいたします。 自分でもいろいろやってみていますが、なかなか糸口が見つかりません。 しかし、数値への変換はupdate ステートメントを実行してからのような気がします。update ステートメントのオプションで文字を数値に変換させないようなものはないのでしょうか。 あるいは、書き込み先のテーブルのコラムのプロパティーなどは関係ないでしょうか。 _kappe_さんのお考えをお聞かせください。
- _kappe_
- ベストアンサー率68% (1581/2304)
省略されてしまったfixSongData.phpが鍵なのではないかと思っています。 mb_convert_encoding()でHTML-ENTITIESへの変換をしていたりしませんか。
お礼
ご回答有難う御座います。 4000文字の制限で入れられなかったのと、やっていることは単にテーブルを新しく空き替えたデータでupdate してそのクエリーを表示するだけなので、あまり重要視していませんでしたが、今回お送りいたします。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=cp932"> <title> Karaoke data fix frameset</title> <?php // global variables $host = "localhost"; $user = "root"; $pass = "rsi2018"; $database = "karaoke"; $connection; $connection = mysqli_connect($host, $user, $pass, $database) or die("cannot connect to database"); $id = $_POST['num2']; $ttl = $_POST['title2']; $sng = $_POST['singer2']; $query ="update num2song set title= '".$ttl."', singer='".$sng."' where id=$id"; echo $query."<BR>"; $result = mysqli_query($connection, $query); mysqli_close($connection); ?> </head> <body> </body> </html> これを見て頂いて、どこか不審な点がありますでしょうか。 何か気が付いたことがあれば教えてください。
- _kappe_
- ベストアンサー率68% (1581/2304)
試しに、下記のHTMLファイルをウェブブラウザで表示してみてください。 1行目に渡良瀬橋と表示され、2行目に渡良瀬橋と表示されるはずです。 <html lang="ja"> <head><title>Test</title></head> <body> 渡良瀬橋 <br> &#28193;&#33391;&#28716;&#27211; </body> </html> 文字を数値文字参照の形式に変換(渡→渡)している処理があり、加えてその中の&を&に置き換える処理がどこかにあるのかもしれません。 里の数値文字参照は里ですが、それが途中で切れているのも気になります。
お礼
ご回答有難うございます。 ご提案のコードをブラウザで表示しましたら、おっしゃる通りに以下のように表示されました。 渡良瀬橋 渡良瀬橋 回答者様の回答の意味がよく理解できないのですが、私のプログラムの中に「文字を数値文字参照の形式に変換(渡→渡)している処理があり、加えてその中の&を&に置き換える処理がどこかにある」 という事なのでしょうか?つまり自分では気が付かないけれどそのような機能を持った関数を使っていると。 プログラムのソースコードは第一回答者の方に送ったものが在りますので,それを見て頂きたいのですが、自分ではそのような関数の存在は意識していません。 また「千」の数値文字参照については、時分はよくわからないので、コメントできません。
- _kappe_
- ベストアンサー率68% (1581/2304)
これは文字化けではなく、数値文字参照がそのまま表示されているだけです。 渡→渡 良→良 千→千 里→里(画像では4;の部分が切れている) どのような処理をしているか分からないので修正方法は回答不能です。
お礼
早速にご回答を頂き、有難うございます。 数値参照表現という言葉もよくわからないレベルの者ですが、処理内容ならプログラムのソースを提示することは出来ます。 よろしければその中身を見て、どの部分でこのようなことが起きているのかを指摘して頂ければ幸いです。 全体の構成としては、以下の通りです。 database name: num2song database fields: id = primary key, auto increment number = 歌の識別番号 これがあれば歌を一意に決定できるので ID は不要なのですが、癖になっていてIDを付けてしまいます。 title = 曲名 singer = 歌手名 path = 外付けハードディスク内の曲の位置 データベースの各フィールドのデータはPathから抽出しています。Pathのなかにあるスペースや'/' 記号などを目安にして、PHPの文字列関係の館数を使ってnumber, title, singer などを抽出しましたが、Pathの構成にあまり一貫性が無いので、曲名や歌手名が正しく取り出せないものが沢山あります。 幸い歌の番号はちゃんと取り出せたので、その番号を入力して曲を演奏し始めてカラオケは出来るようになったのですが、そのプログラムの改良版として、歌手の名前を入力したらその歌手の曲が全てプルダウンリストとして表示され、そこから曲お選ぶようにしたいと考えています。 そのためには歌手名が正確なものでなければなりません。そこでこれらの不規則なデータをっ修正しようとして作ったのが今回のプロ恨むで、その実行段階でこの数値参照表現の問題が起こっています。 プログラムの構成は次の通りです。 dataFixFrame.htmlで画面を上下2つに分割し、上にkaraoke-utility.php, 下にfixSongData.phpを置いてあります。 画面には表示されないデータ作成用のプロゴラムsendSongData.phpがあり、karaoke-utility。phpから送られてくる曲の番号に基づいてデータベースからのデータを送り返します。 dataFixFrame.htmlの下のフレームにあるfixSongData.phpは上のフレームで修正したデータがちゃんと書き替えられたかを見るためにクエリー文を表示させてあります。 夫々のプログラムのソースを補足として張り付ておきます。
補足
各プログラムのソースです。 < dataFixFrame.html > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=cp932"> <title> Karaoke data fix frameset</title> </head> <frameset rows="70%, 30%" frameborder="yes"> <frame src="karaoke-utility.html" name="main" style="background-color:teal; color:white"> <frame src ="" name="fix" > </frameset> </html> < karaoke-utility.php > <!DOCTYPE HTML> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=cp932"> <title> shiro utility</title> <script type="text/javascript"> function getData( ){ var xmlhttp = new XMLHttpRequest(); var indexz=document.getElementById("index").value; xmlhttp.onreadystatechange = function(){ if(this.readyState == 4 && this.status == 200){ var object = JSON.parse(this.responseText); document.getElementById("num").value = object.index; document.getElementById("title").value = object.title; document.getElementById("singer").value = object.singer; document.getElementById("path").value = object.path; document.getElementById("num2").value = object.index; document.getElementById("title2").value = object.title; document.getElementById("singer2").value = object.singer; }// if }; // AJAX function xmlhttp.open("GET", "sendSongData.php?index="+indexz, true); xmlhttp.send(null); }// main function getData() </script> </head> <body style="background-color:navy; color:white ;font-size:16pt"> <input type="text" id="index" style="font-size:12pt"><br> <input type="button" value="get one record" onclick="getData()" style="font-size:12pt"> <HR> <form method="POST" action="fixSongData.php" target="fix"> <table border="1" width="100%"> <tr> <th width="20%">index </th> <td width="40%"><input type="text" id="num" size="40" style="font-size:12pt"> </td> <td width="40%"><input type="text" id="num2" name="num2" size="40" style="font-size:12pt"></td> </tr> <tr> <th width="20%">title </th> <td width="40%"><input type="text" id="title" size="40" style="font-size:12pt"> </td> <td width="40%"> <input type="text" id="title2" name="title2" size="40" style="font-size:12pt"></td> </tr> <tr> <th width="20%">singer</th> <td width="40%"><input type="text" id="singer" size="40" style="font-size:12pt"></td> <td width="40%"> <input type="text" id="singer2" name="singer2" size="40" style="font-size:12pt"></td> </tr> </table> <br> <input type="submit" value="send new data"> </form> <input type="text" id="path" size="100"> </body> </html> <sendSongData.php > <?php $index=$_GET['index']; //$index=50; // file name=sendSongData.php // global variables $host = "localhost"; $user = "root"; $pass = "rsi2018"; $database = "karaoke"; $connection = mysqli_connect($host, $user, $pass, $database) or die("cannot connect to database"); $allData = array(); $query ="select * from num2song where id=$index"; $result= mysqli_query($connection, $query) or die("fail-1"); //$i=0; $row=mysqli_fetch_assoc($result); $allData=array("index"=>$row['id'], "title" =>$row['title'], "singer"=>$row['singer'], "path" =>$row['path'] ); //echo $allData[$i]["path"]."<BR>"; //$i++; $sentData =json_encode($allData); echo $sentData; mysqli_close($connection); ?> $connection = mysqli_connect($host, $user, $pass, $database) or die("cannot connect to database"); $allData = array(); $query ="select * from num2song where id=$index"; $result= mysqli_query($connection, $query) or die("fail-1"); //$i=0; $row=mysqli_fetch_assoc($result); $allData=array("index"=>$row['id'], "title" =>$row['title'], "singer"=>$row['singer'], "path" =>$row['path'] ); //echo $allData[$i]["path"]."<BR>"; //$i++; $sentData =json_encode($allData); echo $sentData; mysqli_close($connection); ?> 字数制限のためfixSongData.phpは省力します。
お礼
お礼が遅れてしまって申し訳ありません。 何度も御回答を頂き、有難うございました。 私の問題がまだ解決されていないので、この質問はこのままにしておきたいと思います。