接受和接受字符集 – 哪个更好?
在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
我不认为这很重要。 客户正在做一些愚蠢的事情; 这不需要互操作性:-)