euc-jpとPOST送信と文字化け (php)
テキストボックスに「複製」と入力して「submit」したら、 「?」と文字化けする現象が発生した。 不思議なことに同じformなのに ①type="submit" ならば文字化けせず ②type="button" onClick="javascript:document.test_form.submit()" と、javascriptによる「submit」を行なった場合のみ文字化けする。 原因を詳しく調べていくと、①の場合でも文字化けすることが判明した。 「type="submit" value="検索"」の「検索」のように日本語と一緒に送信すると 文字化けしない。value="search" などでは文字化けした。
環境
・テキストエンコード 送信側、受信側:EUC-JP ・php環境 mbstring.internal_encoding などEUC-jp設定
原因
「ホームページ作成/福島県いわき市」によると テキストエンコードがEUC-JPで記述されているサイトでは、 ときおりブラウザがテキストエンコードをSJISなどで解釈してしまって 文字化けが起きるケースがある ということ。 2バイト目がshift-jisのコードの条件に該当するのが原因です。
駄目だった対策
①<meta http-equiv="content-type” content="text/html; charset=EUC-JP”> メタタグでキャラセットをEUC-jpにしても直らない。 ②<form method="" action="" Accept-charset="euc-jp"> 「Accept-charse」 で送信文字コードを指定しても直らない。 ③document.charset='EUC-JP'; javascriptで、テキストエンコードをEUC-jpに指定したが直らない。 ④php.iniの設定 ini_set('default_charset' , ''); ini_set('mbstring.internal_encoding' , ''); ini_set('mbstring.http_output' , ''); ini_set('mbstring.http_output',''); 各種設定を指定したが直らない。
対策
<input type="hidden" name="dummy" value="入口">
「入口」などの2バイト目に「0xFD」や「0xFE」を利用している文字コードを一緒に送信する。
理由は簡単で、2バイト目に「0xFD」や「0xFE」があるのは「EUC-JP」のみだからです。
対策としては、ダミーフィールドが増えるのですっきりとしないですが、
一番簡単で確実な対策方法でした。
参考サイト
・ホームページ作成/福島県いわき市
・PHPの文字化けを本気で解決する - ぎじゅっやさん
・ロックオン開発チームブログ

