• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPでHTMLからPOSTされたデータが文字化けします。)

PHPでHTMLからPOSTされたデータが文字化けする原因と対策

このQ&Aのポイント
  • PHPでHTMLからPOSTされたデータが文字化けする原因として、文字コードの設定が誤っている可能性が考えられます。
  • 具体的には、HTMLのformタグで指定されている文字コードとPHPの処理で指定されている文字コードが一致しているか確認してください。
  • また、文字コードの設定が正しく行われている場合でも、POSTされたデータを正しく処理するために、htmlspecialchars関数やmb_convert_encoding関数などを使用することをおすすめします。

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

  • ベストアンサー
回答No.2

・cp932 これは、Microsoftが拡張した文字も含めたShift_JISのコードのことなので、sjisとは違います。 ※詳しくは参考URLを読んでみて下さい。 ・データベースの文字コード LOAD DATA INFILEはデータベースではなくて、「テーブル」に対して行う処理ですので、 「CREATE DATABASE データベース名 CHARACTER SET cp932;」 などと、データベースを作成するときにデータベースの文字コードを指定する必要があります。 ・「法」は、「・> <input type=」となってしまう すみません勘違いしてました。「法」が文字化けするのであればSJISの「5C問題」とは別の現象ですね。 それでは下記を確認してみてください。 1.HTML部分をSJIS以外で記述していないか(EUC-JPかUTF-8) 2.または<meta http-equiv="Content-Type" content="text/html; charset=sjis">を書いていない 3.もしくは上記を、titleタグの後に書いている 4.POSTされた値に「mb_convert_encoding($_POST['example'], "SJIS")」などと指定している(SJISまたは、sjis-win、Shift_JIS) いかがでしょうか。

ryunohitomi
質問者

お礼

hogehoge78さま 何度も申し訳ありません。 確認してみました。 > 1.HTML部分をSJIS以外で記述していないか(EUC-JPかUTF-8) Shift-JISです。 > 2.または<meta http-equiv="Content-Type" content="text/html; charset=sjis">を書いていない <head>に書いてます。 > 3.もしくは上記を、titleタグの後に書いている <title>の1行上に書いてます。 > 4.POSTされた値に「mb_convert_encoding($_POST['example'], "SJIS")」などと指定している(SJISまたは、sjis-win、Shift_JIS) 特に指定しておりません。 これは指定していなくて正解と言うことですね。 以上のような感じです。宜しくお願い致します。

その他の回答 (1)

回答No.1

Shift_JISは、「表」や、「法」などの文字にバイトコード「5c」が含まれます。 「5c」というのは、「¥」です。 mysqlは、「¥」をエスケープ文字と認識します。 なので、mysql_real_escape_stringや、プリペアドステートメントなどで、二重でエスケープされてしまい、 「表\」、「法\」などとなる場合があります。 逆に、mysqlのデータベースを作成時に文字コードをきちんと「cp932」にしておらず、エスケープ処理を適切にしないでShift_JISの文字をINSERTし、SELECT文で表示しようとした場合、「表」の文字の最後の「5c」が消えて表示されてしまい、文字化けが発生したりします。 とりあえず質問者さんは、 ・データベースの文字コードが「cp932」になっているか ・mysql_real_escape_stringなど、文字のエスケープ処理を行っているか 確認してください。 また、「my.cnf(mysqlのコンフィグファイル)」内の、 「default-character-set」が「cp932」になっているか 逆に上記は設定されていないが「skip-character-set-client-handshake」が設定されているか。 なっていなければ、どちらかを設定してください。 【参考URL1】http://dev.mysql.com/doc/refman/5.1/ja/charset-cp932.html 【参考URL2】http://www.klab.jp/media/mysql/index6.html

ryunohitomi
質問者

お礼

いろいろとアドバイス頂きましてありがとうございました。 少し原因が特定できまして、POSTされた文字列の処理過程で、 $keyword = $_POST['keyword']; $keyword = ereg_replace("[  ]+", " ", $keyword); と言うものを参考にしていたサイトに書かれていたものをそのまま使っていたのですが、この処理を行う際に文字化けを起こすことがわかりました。 何故なのかはわからないのですが、少しずつ調べてみたいと思ってます。

ryunohitomi
質問者

補足

hogehoge78さま ご回答ありがとうございます。 アドバイス頂きました内容について的確にお答え出来ていないかもわかりませんが、 > ・データベースの文字コードが「cp932」になっているか データベースはCSVファイル(Shift-JIS)からLOAD DATA INFILE・・で取り込んでいるのですが、これでデータベースがShift-JISになっていると考えていいのでしょうか。 > ・mysql_real_escape_stringなど、文字のエスケープ処理を行っているか 勉強不足で申し訳ありません。調べてみます。 > 「default-character-set」が「cp932」になっているか 「cp932」と「sjis」は同じと考えてよろしいでしょうか。 「my.ini」で、default-character-set=sjisとなってます。 文字化けはコマンドプロンプト上でMysqlを操作した場合は何も起こらないのです。 また、IEを使ってブラウザ上にデータベースを表示するだけなら問題なくきれいに表示されるのですが、検索したキーワードに「法」や「院」や「。」などが含まれているとおかしくなります。 > 「表\」、「法\」などとなる場合があります。 この環境では、「表」は正常に表示されます。 「法」は、「・> <input type=」となりおかしくなります。