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

我正在使用一个“有趣”的HTML特殊字符(✰)(请参阅http://html5boilerplate.com/获取更多信息) Server HTTP头,并且想知道是否每个规范“允许”。

  • 在Windows Xp Pro SP 3的Chrome中,使用“开发工具”中的“networking”选项卡,我可以看到✰。

  • 在IE8中,✰ 不能正确显示。

  • w3.org HTMLvalidation器不能正确显示(显示“ â° ”代替)。

现在,我不太喜欢字符编码……坦率地说,我并不太在乎它们; 我只是盲目地使用UTF-8 cus我被告知。 🙂


在不同的parsing器/浏览器/引擎/(无论他们被称为)的错误造成的差距?

有没有这个规范,或者HTTP头“值”允许字符的列表?

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

HTTPbis放弃了,并指定在头文件除了ASCII之外没有其他有用的编码:

历史上,HTTP允许字段内容使用ISO-8859-1字符集[ISO-8859-1]中的文本,仅通过使用[RFC2047]编码来支持其他字符集。 实际上,大多数HTTP头字段值只使用US-ASCII字符集[USASCII]的一个子集。 新定义的头字段应该将其字段值限制为US-ASCII八位字节。 接收者应该将字段内容(obs-text)中的其他八位字节视为不透明的数据。


以前,1999年的RFC 2616对此进行了定义:

只有当根据RFC 2047 [14]的规则进行编码时,* TEXT的字可以包含来自ISO-8859-1 [22]以外的字符集的字符。

RFC 2047是MIME编码 ,所以它是:

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

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

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


您可以使用任何可打印的ASCII字符,并且不能使用特殊的字符(如:不是ASCII )

提示 :你可以用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是空格或制表符,但您可以通过在空格或制表符之前开始新行来将字段值分成多行。

让我们简化为:

 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字符都是允许的。