- ベストアンサー
ブラウザが文字コードを誤判別する
- PHPでフォームを含むHTMLを出力しています。POSTを使ってページ移動すると、ブラウザが文字コードを誤判別します。
- 表示が文字化するのではなく、ブラウザのエンコードが誤判別され、POSTで次ページに移動するとPOSTされる文字列だけが文字化けします。
- ブラウザは、WinXP Pro SP2 + IE6.0 です。ブラウザの不具合でしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>POSTする文字コードは特に指定していません。 >POSTされる文字コードは、入力フォームがあるページの文字コードと同じ文字コード(Shift_JIS)になるという認識ですが・・・。 スクリプト自体はEUC-JPでoutputはSJISということですが、inputについては「そのまま」ですよね?であれば >POSTを受け取るスクリプトでは、特に文字コード変換はしておらず、$_POST['FORM_NAME']で値を取得し利用しています。 >やはりPOSTで受け取った文字列の文字コードを検出し、必要に応じて文字コード変換した方がよいでしょうか。 SJISでPOSTされていますから、いったんEUC-JPに変換してから使わないと化けると思いますが・・ htmlがSJISであれば、magic_quotes_gpc関連とか文字列のリテラル定義に注意して「スクリプトをSJISで書く」というのも考えていいと思います。
その他の回答 (2)
- shimix
- ベストアンサー率54% (865/1590)
ANo.1です。 自動判別が誤っているのか、ブラウザに返されるデータがおかしいのかの切り分けはされているんですよね?ブラウザで強制的にSJISにしても化けるのであればデータがおかしい・・ということでANo.1を書きました。 #「POSTした文字列だけ」ということですし・・ ブラウザが判別を誤るような場合は(metaタグよりもHTTPレスポンスの方が優先されるので)スクリプトの先頭に header("Content-Type: text/html;charset=Shift_JIS"); などを入れれば確実に「SJIS」で認識します。
お礼
ご丁寧に何度もご回答ありがとうございます。 HTMLのヘッダーにmetaタグでShift_JISを指定しても、ブラウザのエンコードを見るとUnicode(UTF-8)になることがあるのです。 しかし、そのときのブラウザ上の表示は文字化けしていません。 ブラウザのエンコードを手動で「日本語(シフトJIS)」にしてPOST送信すると文字化けしません。 > header("Content-Type: text/html;charset=Shift_JIS"); これを試してみたいと思います。 OKWaveのHTMLソースを見るとヘッダーのmetaタグの前に、 <!-- 龠龠龠 --> とコメントがありますね。 このおまじないも効果があるのでしょうか? (でもこれは出力文字コードがEUC-JPのときに効果があるのですかね?) 調べてて知ったのですが、Firefoxなど(IE以外)限定でformタグの中に accept-charset="Shift_JIS" と書くことで、POSTする文字コードを指定できるようですね。
- shimix
- ベストアンサー率54% (865/1590)
POSTされる文字列は(フォームの文字コードの記載がありませんが)SJISですよね?受け取ったスクリプトでEUC-JPに変換していると思いますが、mb_convert_encodingはどのように書かれていますか? 元コードを自動判別にしていると内容によっては誤判別の可能性があります。固定的にSJIS→EUC-JPならいいとは思いますが、逆にブラウザからのPOSTが誤っていると化けます。 で、よくやるのは「適当な文字列」をhidden項目で追加してPOSTさせて、その文字コードを判別に利用する手です。 $post_charset = mb_detect_encoding(implode('', $_POST));
お礼
ご回答ありがとうございます。 POSTする文字コードは特に指定していません。 POSTされる文字コードは、入力フォームがあるページの文字コードと同じ文字コード(Shift_JIS)になるという認識ですが・・・。 POSTを受け取るスクリプトでは、特に文字コード変換はしておらず、$_POST['FORM_NAME']で値を取得し利用しています。 やはりPOSTで受け取った文字列の文字コードを検出し、必要に応じて文字コード変換した方がよいでしょうか。 ちなみに、この現象は1台のPCでだけ発生し他のPCでは発生しません…。
お礼
何度も回答ありがとうございました。 お礼が遅くなりすみません。 最終的にわかったことは、「サーバ側の設定ミス」でした。 お恥ずかしいです…。 VirtualHostでWebサーバを分けており、設定ミスにより他のVirtualHostの文字コードの設定が影響する場合がありました。 今回いろいろ勉強になりました。 ありがとうございました。