接受和接受字符集 – 哪个更好?

在HTTP中,您可以在请求中指定您的客户端可以接受使用accept头的响应中的特定内容,并使用诸如application/xml值。 内容types规范允许你在内容types中包含参数,例如charset=utf-8 ,表示你可以接受指定字符集的内容。

还有accept-charset头,它指定客户端接受的字符编码。

如果两个头都被指定,并且accept头包含带有charset参数的内容types,那么服务器应该将其视为高级头?

例如:

 Accept: application/xml; q=1, text/plain; charset=ISO-8859-1; q=0.8 Accept-Charset: UTF-8 

我已经使用Fiddler发送了几个示例请求到各种服务器来testing它们如何响应:

例子

W3

请求

 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 

堆栈溢出

请求

 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 

微软

请求

 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 

关于预期的行为似乎没有任何共识。 我试图看起来很惊讶。

尽pipe你可以在Accept标头中设置媒体types,但RFC 2616中的任何地方都没有定义该媒体types的charset参数定义(但它并不是禁止的)。

因此,如果要实现符合HTTP 1.1的服务器,则应首先查找Accept-charset标头,然后在Accept标头中search自己的参数。

阅读RFC 2616第14.1和14.2节。 Accept头不允许你指定一个charset 。 您必须改用Accept-Charset头。

首先,Accept标头可以接受参数,参见https://tools.ietf.org/html/rfc7231#section-5.3.2

所有文本/ * MIMEtypes可以接受字符集参数。 http://www.iana.org/assignments/media-types/media-types.xhtml#text

Accept-Charset头允许用户代理指定它支持的字符集。

如果Accept-Charset头部不存在,则用户代理将必须为其接受的每个文本/媒体types指定每个字符集参数,例如

Accept: text/html;charset=US-ASCII, text/html;charset=UTF-8, text/plain;charset=US-ASCII, text/plain;charset=UTF-8

我不认为这很重要。 客户正在做一些愚蠢的事情; 这不需要互操作性:-)