私は ISO-8859-1 データベースを持っているので、リクエスト全体をこのコードページで交換したいと思っています。では、AJAX リクエストの content-type を正しい方法で設定するにはどうすればよいでしょうか?
3 に答える
行うのは悪いことですが(上記のコメントの束)、これは機能します:
var xhr = new XMLHttpRequest();
xhr.open("GET", path, false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=ISO-8859-1')
jQuery を使用している場合: https://stackoverflow.com/a/553572/2527433
XMLHttpRequest.send()の W3C 仕様によると、dataの値に応じて、ほとんどの場合、charset は UTF-8 になります。指定した文字セットエンコーディングでさえ、UTF-8 で上書きされる可能性があります。
Content-Type ヘッダーが作成者の要求ヘッダーにあり、その値が有効な MIME タイプであり、その値がencodingの大文字と小文字を区別しない一致ではなく、encodingが null でない charset パラメーターを持つ場合、その Content のすべての charset パラメーターを設定します。 -エンコーディングにヘッダーを入力します。
ユーザー エージェントがエンコーディングを決定するための多少の余地があります。AJAX を含むページのエンコーディングを ISO-8859-1 に設定します。UA は、W3C アルゴリズムの解釈に応じて、すべてのフォーム送信 (フォームで別のエンコーディングが指定されていない限り) とおそらく AJAX 送信に対して ISO を想定します。
最終的に、唯一の信頼できる解決策は、訪問者に表示されるページ (AJAX を含む) を ISO-8859-1 に設定し、それを確認してバックエンドで ISO に変換することです (サニタイズする必要があります)。とにかくデータベースに送信する前にすべてのユーザー入力を処理するため、この変換をプロセスに追加するだけです)。PHP または特定の言語でこれを行うためのライブラリ関数はたくさんあります。そうしないと、仕様への準拠を保証する方法がないため、バックエンドのエンコーディングを絶対に確認/確認してください。
エンコーディングと charset パラメータについて説明する必要があると思います。これらは、ネットワーク経由で送信された生のバイトをどのようにデコードするかに関するものです。
たとえば、コンテンツ タイプapplication/x-www-form-urlencoded
と次のデータについて考えてみます。
0x61253344254345254232
charset がなかったので (実際、charset はこのコンテンツ タイプでは無効なパラメーターです...)、ISO-8859-1 を想定する必要があります。したがって、上記を ISO-8859-1 でデコードすると、次のようになります。
"a%3D%CE%B2"
現在、独自のルールを持つデコードする別の形式 (フォーム urlencoded) があります。現在の仕様では、ここでのパーセント エンコーディングは UTF-8 でなければならないと言われているため、文字列->文字列変換を実行すると、上記の結果が得られます。
"a=ß"
ご覧のとおり、この形式では ASCII 以外の文字は使用されないため、文字セットは重要ではなく、とにかくサポートされていません。
実際の問題は、パーセントエンコーディングが使用するエンコーディングとは関係ありません。ISO-8859-1 でパーセント エンコードするカスタム関数を定義したとしても、サーバーは到着時にそれをデコードし、データベース用にエンコードする必要があります。このことからあなたが得るものは何もありません。