然而,我尝试过的HTTP服务器拒绝接受代码大于127的任何内容(或大多数US-ASCII不可打印字符)。
以下是标准中使用的语法摘录:
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
序列(即除"
和值从[0-8, 11-12, 14-31, 127]
范围之外的任何8位八进制数)或quoted-pair
(后跟来自[0, 127]
范围内的任何值的\
)。也就是说,通过加引号和添加\
前缀的特殊符号,可以传递任何8位字符序列。
(注意,标准不会以任何特殊方式处理NUL(0x00)
字符)
但是,很显然,我尝试过的所有服务器都不符合规范,或者自1999年以来标准已经改变,或者我无法正确阅读它。
那么... HTTP标头值允许使用哪些字符以及为什么?
附言:我正在寻找在HTTP标头值中传递utf-8编码序列的方法(如果可能的话,不需要额外的编码)。
field-names
中的separators
也需要进行编码。此外,如果您使用WinHTTP,则必须对field-name
中的单引号符号进行编码,否则请求将失败。 - C.M.