ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:dotetty ブラウザが文字コードを誤判別する
困り度:
  • すぐに回答を!
PHPでフォームを含むHTMLを出力しています。
POSTを使ってページ移動すると、ブラウザが文字コードを誤判別します。
表示が文字化するのではなく、ブラウザのエンコードが誤判別され、POSTで次ページに移動するとPOSTされる文字列だけが文字化けします。
リンクによる移動では、誤判別しません。

php.iniの設定
default_charset = Shift_JIS
mbstring.internal_encoding = EUC-JP
mbstring.http_output = Shift_JIS

PHPのソースは、EUC-JPで書いています。
出力するHTMLには、
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"/>
をヘッダーに記述しています。

この現象は100%発生するわけではなく、完全にランダムです。
確実な再現手順はありません。
ブラウザは、WinXP Pro SP2 + IE6.0 です。
ブラウザの不具合でしょうか?
質問投稿日時:08/05/03 12:47
質問番号:3994421
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:shimix >POSTする文字コードは特に指定していません。
>POSTされる文字コードは、入力フォームがあるページの文字コードと同じ文字コード(Shift_JIS)になるという認識ですが・・・。

スクリプト自体はEUC-JPでoutputはSJISということですが、inputについては「そのまま」ですよね?であれば

>POSTを受け取るスクリプトでは、特に文字コード変換はしておらず、$_POST['FORM_NAME']で値を取得し利用しています。
>やはりPOSTで受け取った文字列の文字コードを検出し、必要に応じて文字コード変換した方がよいでしょうか。

SJISでPOSTされていますから、いったんEUC-JPに変換してから使わないと化けると思いますが・・

htmlがSJISであれば、magic_quotes_gpc関連とか文字列のリテラル定義に注意して「スクリプトをSJISで書く」というのも考えていいと思います。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/05/04 19:50
回答番号:No.3
この回答へのお礼何度も回答ありがとうございました。
お礼が遅くなりすみません。

最終的にわかったことは、「サーバ側の設定ミス」でした。
お恥ずかしいです…。
VirtualHostでWebサーバを分けており、設定ミスにより他のVirtualHostの文字コードの設定が影響する場合がありました。

今回いろいろ勉強になりました。
ありがとうございました。

回答

 

回答者:shimix ANo.1です。

自動判別が誤っているのか、ブラウザに返されるデータがおかしいのかの切り分けはされているんですよね?ブラウザで強制的にSJISにしても化けるのであればデータがおかしい・・ということでANo.1を書きました。

#「POSTした文字列だけ」ということですし・・

ブラウザが判別を誤るような場合は(metaタグよりもHTTPレスポンスの方が優先されるので)スクリプトの先頭に

  header("Content-Type: text/html;charset=Shift_JIS");

などを入れれば確実に「SJIS」で認識します。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/05/03 14:25
回答番号:No.2
この回答へのお礼ご丁寧に何度もご回答ありがとうございます。

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 POSTされる文字列は(フォームの文字コードの記載がありませんが)SJISですよね?受け取ったスクリプトでEUC-JPに変換していると思いますが、mb_convert_encodingはどのように書かれていますか?

元コードを自動判別にしていると内容によっては誤判別の可能性があります。固定的にSJIS→EUC-JPならいいとは思いますが、逆にブラウザからのPOSTが誤っていると化けます。

で、よくやるのは「適当な文字列」をhidden項目で追加してPOSTさせて、その文字コードを判別に利用する手です。

  $post_charset = mb_detect_encoding(implode('', $_POST));
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/05/03 14:05
回答番号:No.1
この回答へのお礼ご回答ありがとうございます。

POSTする文字コードは特に指定していません。
POSTされる文字コードは、入力フォームがあるページの文字コードと同じ文字コード(Shift_JIS)になるという認識ですが・・・。

POSTを受け取るスクリプトでは、特に文字コード変換はしておらず、$_POST['FORM_NAME']で値を取得し利用しています。
やはりPOSTで受け取った文字列の文字コードを検出し、必要に応じて文字コード変換した方がよいでしょうか。

ちなみに、この現象は1台のPCでだけ発生し他のPCでは発生しません…。
 
最新から表示回答順に表示良回答のみ表示