HTTPでは、accept
ヘッダーとapplication/xml
などの値を使用して、クライアントが応答で特定のコンテンツを受け入れることができるようにリクエストで指定できます。コンテンツタイプの仕様では、charset=utf-8
などのコンテンツタイプにパラメーターを含めることができます。これは、指定した文字セットのコンテンツを受け入れることができることを示します。
accept-charset
ヘッダーもあります。これは、クライアントが受け入れる文字エンコードを指定します。
両方のヘッダーが指定されており、accept
ヘッダーにcharsetパラメーターを持つコンテンツタイプが含まれている場合、サーバーは上位ヘッダーと見なしますか?
例えば。:
Accept: application/xml; q=1,
text/plain; charset=ISO-8859-1; q=0.8
Accept-Charset: UTF-8
Fiddlerを使用してさまざまなサーバーにいくつかのサンプルリクエストを送信し、それらの応答方法をテストしました。
例
W
リクエスト
GET http://www.w3.org/ HTTP/1.1
Host: www.w3.org
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1
応答
Content-Type: text/html; charset=utf-8
リクエスト
GET http://www.google.co.uk/ HTTP/1.1
Host: www.google.co.uk
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1
応答
Content-Type: text/html; charset=ISO-8859-1
StackOverflow
リクエスト
GET http://stackoverflow.com/ HTTP/1.1
Host: stackoverflow.com
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1
応答
Content-Type: text/html; charset=utf-8
Microsoft
リクエスト
GET http://www.Microsoft.com/ HTTP/1.1
Host: www.Microsoft.com
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1
応答
Content-Type: text/html
予想される動作が何であるかについて、コンセンサスは得られていないようです。私は驚いて見えるようにしています。
Accept
ヘッダーにメディアタイプを設定できますが、そのメディアタイプのcharset
パラメーター定義は RFC 2616 で定義されていません(ただし、禁止されていませんが、 )。
したがって、HTTP 1.1準拠のサーバーを実装する場合、最初にAccept-charset
ヘッダーをクリックし、Accept
ヘッダーで独自のパラメーターを検索します。
読み取り RFC 2616 セクション14.1および14.2 Accept
ヘッダーでは、charset
を指定できません。代わりにAccept-Charset
ヘッダーを使用する必要があります。
まず、Acceptヘッダーはパラメーターを受け入れることができます。 https://tools.ietf.org/html/rfc7231#section-5.3.2 を参照してください
すべてのtext/* mime-typesはcharsetパラメーターを受け入れることができます。 http://www.iana.org/assignments/media-types/media-types.xhtml#text
Accept-Charsetヘッダーにより、ユーザーエージェントはサポートする文字セットを指定できます。
Accept-Charsetヘッダーが存在しない場合、ユーザーエージェントは、eachtext/*に対してeachcharsetパラメーターを指定する必要があります受け入れられたメディアタイプ、例えば.
Accept: text/html;charset=US-ASCII, text/html;charset=UTF-8, text/plain;charset=US-ASCII, text/plain;charset=UTF-8
RFC 7231セクション5.3.2(Accept
) は次のように明確に述べています:
各メディア範囲の後には、0個以上の適用可能なメディアタイプパラメータ(例:charset)が続く場合があります
したがって、各content-typeのcharsetパラメーターが許可されます。理論的には、クライアントは、たとえばtext/html
のみUTF-8
およびtext/plain
のみUS-ASCII
。
しかし、通常は、可能な文字セットを Accept-Charset
header これは、Accept
ヘッダーに記載されているすべてのタイプに適用されます。
これらのヘッダーの文字セットが重複しない場合、サーバーはステータスを送信できます 406 Not Acceptable
。
ただし、さまざまな理由でサーバーからの素晴らしいクロスマッチは期待していません。実際にはクライアントが まれに このようなリクエストを送信する一方で、サーバーコードがより複雑になり(したがって、よりエラーが発生しやすくなります)。また、最近では、サーバー側がすべてUTF-8を使用してそのまま送信されることを期待しているため、交渉の余地はありません。