我应该使用什么字符编码作为 HTTP 头?

我正在使用一个“有趣的”HTML 特殊字符(something)(见 http://html5boilerplate.com/了解更多信息)的 Server HTTP 头,我想知道它是否“允许”每规范。

  • 在 Windows Xp Pro SP 3的 Chrome 开发工具中使用 Network Tab,我看到了“刚刚好”。

  • 在 IE8中,something is 没有被正确渲染。

  • W3.org HTML 验证器会正确地呈现 没有(而是显示“ â°”)。

现在,我不太热衷于字符编码... 坦率地说,我真的不太关心他们; 我只是盲目地使用 UTF-8,因为我被告知。:-)


是不同的解析器/浏览器/引擎/(不管它们叫什么)中的 bug 导致了这种差异吗?

有没有这方面的规范,或者是允许 HTTP 头“值”使用的字符列表?

119632 次浏览

简而言之: 只有 ASCII 才能保证工作。一些非 ASCII 字节允许向后兼容,但不应该是可显示的。

HTTPbis 放弃了 ,并明确指出,在标头中,除了 ASCII 以外,没有其他有用的编码:

历史上,HTTP 允许字段内容在 ISO-8859-1字符集[ ISO-8859-1] ,仅支持其他字符集 通过使用[ RFC2047]编码 字段值只使用 US-ASCII 字符集的一个子集[ USASCII ]。 新定义的头字段应将其字段值限制为 US-ASCII 八字节。接受者应该治疗场内的其他八字节 内容(obs-text)作为不透明数据。


此前,1999年的 RFC 2616定义了这一点:

文本字词可能包含 ISO-以外的字符集中的字符 8859-1[22]仅当根据 RFC 2047[14]的规则进行编码时。

而 RFC 2047就是 MIME 编码所以应该是:

=?UTF-8?Q?=E2=9C=B0?=

但我认为没有多少(如果有的话)客户支持它。

请先阅读评论,这个答案很可能从正确的来源得出错误的结论,需要编辑。


您可以使用任何可打印的 ASCII 字符,并且没有像 something (不是 ASCII)这样的特殊字符

Tip : 您可以用 JSON 对任何内容进行编码。

编辑 : 可能一开始并不明显,标题中定义的字符编码只适用于响应主体,而不适用于标题本身。(因为这会引起鸡和蛋的问题。)


我想总结所有相关的定义,根据由 Penchant 链接的 规格

message-header = field-name ":" [ field-value ]
field-name     = token
field-value    = *( field-content | LWS )

所以,我们在 字段值之后。

LWS            = [CRLF] 1*( SP | HT )
CRLF           = CR LF
CR             = <US-ASCII CR, carriage return (13)>
LF             = <US-ASCII LF, linefeed (10)>
SP             = <US-ASCII SP, space (32)>
HT             = <US-ASCII HT, horizontal-tab (9)>

LWS 代表线性空白。实际上,LWS 是 Space 或 Tab,但是您可以通过在 Space 或 Tab 之前开始一个新行来将字段值分成多行。

让我们简化一下:

field-value    = <any field-content or Space or Tab>

现在我们追求的是 字段-内容

field-content  = <the OCTETs making up the field-value
and consisting of either *TEXT or combinations
of token, separators, and quoted-string>
OCTET          = <any 8-bit sequence of data>
TEXT           = <any OCTET except CTLs,
but including LWS>
CTL            = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT

文本是最一般的,包括了所有的其余部分——所以忘记其余部分吧。 下面是 US-ASCII 字符集 (= ASCII)

如您所见,所有可打印的 ASCII 字符都是允许的。