HTTP请求和响应头有哪些charsets?

时间:2014-12-21 13:59:45

标签: php http encoding utf-8 character-encoding

当HTTP客户端向Web服务器发送请求时,如下所示:

GET /index.html HTTP/1.1
Host: www.example.com

并且服务器用这样的simething响应:(来自维基百科的例子)

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
ETag: "3f80f-1b6-3e1cb03b"
Content-Type: text/html; charset=UTF-8
Content-Length: 131
Accept-Ranges: bytes
Connection: close

<html>
<head>
  <title>An Example Page</title>
</head>
<body>
  Hello World, this is a very simple HTML document.
</body>
</html>

回复包含字段Content-Type: text/html; charset=UTF-8。但这只是告诉响应中空行之后的字节编码。

请求和响应头(空行之前的所有内容)有什么字符集?它们是ASCII还是UTF-8还是其他任何字符集?

2 个答案:

答案 0 :(得分:1)

看起来有点复杂,但基线是标题必须是ASCII。

Sending non-ASCII text in Http POST header

HTTP headers encoding/decoding in Java

答案 1 :(得分:1)

这曾经在RFC 2616中定义(有点模糊)。但是,去年夏天RFC 2616被RFC 7230“超文本传输​​协议(HTTP / 1.1):消息语法和路由”中的一系列RFC取代。它在条款3.2.4中更现实地回答了这个问题,但仍然有些模糊:

  

历史上,HTTP允许字段内容包含文本   ISO-8859-1 charset [ISO-8859-1],仅支持其他字符集   通过使用[RFC2047]编码。在实践中,大多数HTTP标头
  字段值仅使用US-ASCII字符集[USASCII]的子集   新定义的标题字段应该将其字段值限制为
  US-ASCII八位字节。收件人应该在字段中处理其他八位字节   内容(obs-text)为不透明数据。

HTTP的基本语法中的字符当然是ASCII字符。某些标头可能包含其他数据。为每个标头定义字符限制和字节解释。基本定义在RFC 7231中。对于大多数标头,它们的显式语法将字符限制为ASCII。即使在评论中,RFC 7231也只允许非ASCII字节作为过时的功能。