最近、POST メソッドを使用して行われた AJAX 呼び出しの文字エンコーディングに関連する非常に奇妙な動作に遭遇しました。簡単に言うと、分音記号 (" ä " など) を受け入れることができるテキスト フィールドを持つ HTML フォームがあります。フォームが送信されると、フォーム データが XML ブロックにラップされてサーバーに送信され、その情報が MySQL データベースに保存されます。その後、その情報はデータベースから取得され、通常のユーザーにそのまま表示されます。
リクエストが Chrome または IE から送信された場合、すべて問題ありません。これは、分音記号を含むデータが送信、保存、取得、および正しく表示されることを意味します。ただし、これに Firefox を使用すると、XML はフォーム データを正しく送信しているように見えますが、Web ページをリロードすると、以前に送信された分音符号が表示されません。つまり、どこかで道に迷っているように見えます。たとえば、XML に「tästä」という単語が含まれている場合、ページをロードすると「 tst 」と表示されます。
なぜこうなった?Firefox は投稿メッセージを IE や Chrome とは異なる方法でエンコードしていますか?
それが役立つ場合は、Chrome と Firefox のリクエスト ヘッダーとレスポンス ヘッダーをまったく同じフォーム コンテンツに添付しました。
ところで、サーバーに送信する前にデータをエンコードするのではなく、フォーム フィールドの値をそのまま取得するだけです。
クロム:
XML データ ブロック:
<request>
<session>{hidden by me}</session>
<builder>Hem i Stan tästä</builder>
</request>
リクエストヘッダー:
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:562
Content-Type:application/x-www-form-urlencoded
Cookie:PHPSESSID=rlne2d787j0np52ec5rtn04dm1
Host:83.150.87.220
Origin:http://hidden.by.me
Referer:http://http://hidden.by.me/?c=2094211
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
X-Requested-With:XMLHttpRequest
応答ヘッダー:
Connection:Keep-Alive
Content-Encoding:gzip
Content-Type:application/xml
Date:Mon, 17 Sep 2012 16:21:58 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.11 (Win32) PHP/5.2.9-1
Transfer-Encoding:chunked
Vary:Accept-Encoding
ファイアフォックス:
XML データ ブロック:
<request>
<session>{hidden by me}</session>
<builder>Hem i Stan tästä</builder>
</request>
リクエストヘッダー:
Accept */*
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection keep-alive
Content-Length 562
Content-Type application/x-www-form-urlencoded; charset=UTF-8
Cookie PHPSESSID=kvfg4fp2trorllim19dmn241c7
Host hidden.by.me
Referer http://hidden.by.me/?c=2094211
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
X-Requested-With XMLHttpRequest
応答ヘッダー:
Connection Keep-Alive
Content-Encoding gzip
Content-Type application/xml
Date Mon, 17 Sep 2012 16:21:23 GMT
Keep-Alive timeout=5, max=100
Server Apache/2.2.11 (Win32) PHP/5.2.9-1
Transfer-Encoding chunked
Vary Accept-Encoding