11

最近、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
4

2 に答える 2

6

@Pointy が少し前に述べたように、Firefoxは他のブラウザーとは異なる方法でメッセージをエンコードするように見えるため、問題はリクエストContent-Typeに関連していました。私の頭の中ではとは同じだったので、両方の場合に文字エンコード標準として指定する必要があることに気づきませんでした。しかし、と の両方を明確な「text/xml; charset=UTF-8」に変更すると、問題は解決しました。POSTPOSTData-TypeContent-TypeUTF-8Content-TypeData-Type

于 2012-11-12T15:55:34.813 に答える
1

私はとても幸せです。これを以前に投稿して理解してくれてありがとう。グーグルでこれを見つけるのに十分なほど問題に近づくのに数時間かかりましたが、あなたのコメントのおかげで、1日もかからずに解決しました。明日の大きなプレゼンテーションに間に合うように!:)

すべてのブラウザがまったく同じデータ文字列を AJAX リクエストで送信しているのに、ブラウザによって結果が異なる (Firefox は異なる) というのは非常に奇妙でした。

私はこれを試しましたが、うまくいきませんでした:

req.setRequestHeader (「エンコーディング」、「utf-8」);

それから、あなたが Firefox で行っていることを実行したところ、1 つのコーディング ソリューションがすべてのブラウザーで機能します。

req.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

Chrome、MSIE、Firefox、Safari、Opera、Opera Next でテストしました。いつでも活躍!

于 2013-01-28T15:16:07.983 に答える