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

Dav*_*och 114 http-headers

我正在使用一个"有趣"的HTML特殊字符(✰)(请参阅http://html5boilerplate.com/获取更多信息)获取ServerHTTP标头,并且我想知道它是否符合每个规范.

  • 在Windows Xp Pro SP 3上使用Chrome中的开发工具中的网络选项卡,我看到✰很好.

  • 在IE8中,✰ 正确呈现.

  • w3.org HTML验证器无法正确呈现它(显示" â°"代替).

现在,我不太热衷于角色编码......坦率地说,我并不太关心它们; 我只是盲目地使用UTF-8 cus我被告知.:-)


是不是由不同的解析器/浏览/引擎/中的错误引起的差异(无论他们被称为什么)?

是否有针对此标准或可能是HTTP标头"值"的允许字符列表?

Kor*_*nel 116

简而言之:只保证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?=
Run Code Online (Sandbox Code Playgroud)

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

  • 为了扩展一个非常有用的答案:"UTF-8"是字符集,"Q"表示该值将是"quoted-printable".如果您想对BASE64进行编码,也可以使用"B". (8认同)
  • 那么,这意味着什么?"✰"有效/允许吗? (7认同)

zup*_*upa 10

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


你可以使用任何可打印的ASCII字符,也没有像✰那样的特殊字符(不是ASCII)

提示:您可以使用JSON编码任何内容.

编辑:一开始可能不明显,标题中定义的字符编码仅适用于响应主体,而不适用于标头本身.(因为它会导致鸡 - 蛋问题.)


我想根据Penchant链接的规范总结所有相关定义.

message-header = field-name ":" [ field-value ]
field-name     = token
field-value    = *( field-content | LWS )
Run Code Online (Sandbox Code Playgroud)

所以,我们追求的是实地价值.

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)>
Run Code Online (Sandbox Code Playgroud)

LWS代表Linear White Space.本质上,LWS是Space或Tab,但是你可以通过在Space或Tab之前开始一个新行来将你的字段值分成多行.

让我们简化它:

field-value    = <any field-content or Space or Tab>
Run Code Online (Sandbox Code Playgroud)

现在我们追求的是现场内容.

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
Run Code Online (Sandbox Code Playgroud)

TEXT是最一般的,包括所有其余的 - 所以忘了其余的 - . 这是US-ASCII字符集(= ASCII)

如您所见,允许使用所有可打印的ASCII字符.

  • 说“你可以用 JSON 编码任何东西”有点误导。JSON 允许使用 Unicode 字符,而 HTTP 标头应为 US-ASCII。Unicode 字符将被视为“不透明”数据,因此 HTTP 规范未定义该行为。话虽如此,通过使用 \uXXXX 转义序列转义 Unicode 字符,可以使 JSON 安全地包含在 HTTP 标头中。 (3认同)
  • 你**与你引用的段落相矛盾.为什么你说"并没有像✰这样的特殊字符"?特殊字符只是"OCTET",而且"TEXT"是除了"0 - 31"之外的任何"OCTET",这意味着允许从"32"到"255"**的所有"OCTET"**.oc的八位字节是"226","156"和"176",并且所有三个都是允许的,因此根据你引用的段落允许✰. (2认同)
  • @Pacerier你似乎完全正确,我不明白为什么我得出了我的结论. (2认同)