学习后HTTP/1.1标准 https://www.ietf.org/rfc/rfc2616.txt,特别是第 31 页和相关内容,我得出的结论是任何 8 位八位字节都可以出现在 HTTP 标头值中。 IE。代码在 [0,255] 范围内的任何字符。
然而,我尝试拒绝接受任何代码> 127(或大多数 US-ASCII 不可打印字符)的 HTTP 服务器。
以下是标准中使用的语法的干涸摘录:
message-header = field-name ":" [ field-value ]
field-name = token
field-value = *( field-content | LWS )
field-content = <the OCTETs making up the field-value and consisting of
either *TEXT or combinations of token, separators, and
quoted-string>
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)>
CRLF = CR LF
LWS = [CRLF] 1*( SP | HT )
OCTET = <any 8-bit sequence of data>
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
TEXT = <any OCTET except CTLs, but including LWS>
token = 1*<any CHAR except CTLs or separators>
separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\"
| <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT
quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
qdtext = <any TEXT except <">>
quoted-pair = "\" CHAR
如你看到的field-content
可以是一个quoted-string
,这是一个引用序列TEXT
(即任何 8 位八位字节,除了"
和值来自[0-8, 11-12, 14-31, 127]
范围)或quoted-pair
(\
后跟任何值[0, 127]
范围)。 IE。任何 8 位字符序列都可以通过引用它并在特殊符号前加上前缀来传递\
).
(请注意,标准不处理NUL(0x00)
以任何特殊方式字符)
但是,显然,要么我尝试过的所有服务器都不符合要求,要么标准自 1999 年以来已发生变化,要么我无法正确读取它。
那么...HTTP 标头值中允许使用哪些字符以及为什么?
附:这一切背后的原因:我正在寻找一种在 HTTP 标头值中传递 utf-8 编码序列的方法(如果可能,无需额外编码)。