Das Format für HTTP-Header ist in der HTTP-Spezifikation definiert. Ich werde über HTTP 1.1 sprechen, für das die Spezifikation RFC 2616 ist . In Abschnitt 4.2, 'Nachrichtenkopfzeilen', wird die allgemeine Struktur einer Kopfzeile definiert:
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>
Diese Definition beruht auf zwei Hauptpfeilern, Token und TEXT. Beide sind in Abschnitt 2.2, „Grundregeln“ definiert. Token ist:
token = 1*<any CHAR except CTLs or separators>
Auf CHAR, CTL und Separatoren ruhen:
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
TEXT ist:
TEXT = <any OCTET except CTLs,
but including LWS>
Wobei LWS ein linearer weißer Raum ist, dessen Definition ich nicht reproduzieren werde, und OCTET ist:
OCTET = <any 8-bit sequence of data>
Der Definition ist ein Hinweis beigefügt:
The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].
Also zwei Schlussfolgerungen. Erstens, es ist klar , dass der Header - Name aus einer Teilmenge von ASCII - Zeichen zusammengesetzt sein muss - alphanumerics, einige Satzzeichen, nicht viel anders. Zweitens enthält die Definition eines Header- Werts nichts , was ihn auf ASCII beschränkt oder 8-Bit-Zeichen ausschließt: Er besteht explizit aus Oktetten, wobei nur Steuerzeichen gesperrt sind (beachten Sie, dass CR und LF als Steuerelemente betrachtet werden). Darüber hinaus impliziert der Kommentar zur TEXT-Produktion, dass die Oktette als ISO-8859-1 zu interpretieren sind und dass es einen Codierungsmechanismus (der übrigens schrecklich ist) gibt, um Zeichen außerhalb dieser Codierung darzustellen.
Um insbesondere auf @BalusC zu reagieren, ist es ziemlich klar, dass die Header-Werte gemäß der Spezifikation in ISO-8859-1 enthalten sind. Ich habe High-8859-1-Zeichen (insbesondere einige Vokale mit Akzent, wie sie auf Französisch verwendet werden) in einem Header von Tomcat gesendet und sie von Firefox korrekt interpretieren lassen. In gewissem Maße funktioniert dies sowohl in der Praxis als auch in der Theorie (Obwohl dies ein Standort-Header war, der eine URL enthält, und diese Zeichen in URLs nicht legal sind, war dies tatsächlich illegal, aber unter einer anderen Regel!).
Trotzdem würde ich mich nicht darauf verlassen, dass ISO-8859-1 auf allen Servern, Proxys und Clients funktioniert, also würde ich mich aus Gründen der defensiven Programmierung an ASCII halten.