dポイントプレゼントキャンペーン実施中!

PHPでHTMLからPOSTされたデータが文字化けします。
超初心者ですので表現に誤りがあるかもわかりませんがお許しください。
現在、Win2003・MySQL5.1・PHP5.2と言う環境で簡単なデータベースを作成して、HTMLから検索して
一致したデータを表示させると言うものを作成しています。
検索欄に入力した一部の文字がどうしても文字化けしてしまい解決できません。
詳しくはまだ理解できていないのですが、おそらく検索窓に入力した文字がPOSTされて、それを受けたPHPが文字化けした文字でMySQLのデータベースを検索しようとしているのではないかなっと思ってます。
文字コードはすべてShift-JISで行っているつもりです。
たとえば、
全角の"。"や"?"などの2バイトコードが81**(違ってましたらすみません。。)入力すると
"。"は"B"に文字化けされ、"?"は"H"に文字化けします。
また、"院"や"法"などの**40を入力すると"・>  <input type="と表示されて検索ボタンも消えておかしくなってしまいます。
これだけの情報ではお答えして頂けないかもわかりませんが、他にどのような情報があればいいのかもよくわかりません。
わかる範囲で結構ですのでご教授頂けないでしょうか。
よろしくお願い致します。

A 回答 (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)

いかがでしょうか。
    • good
    • 1
この回答へのお礼

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)
特に指定しておりません。
これは指定していなくて正解と言うことですね。
以上のような感じです。宜しくお願い致します。

お礼日時:2010/09/19 05:50

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-c …
【参考URL2】http://www.klab.jp/media/mysql/index6.html

この回答への補足

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=」となりおかしくなります。

補足日時:2010/09/17 09:36
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/22 23:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!