Формат заголовков HTTP определен в спецификации HTTP.Я собираюсь поговорить о HTTP 1.1, для которого спецификация RFC 2616 .В разделе 4.2 «Заголовки сообщений» определена общая структура заголовка:
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>
Это определение основывается на двух основных опорах: токене и TEXT.Оба они определены в разделе 2.2 «Основные правила».Токен:
token = 1*<any CHAR except CTLs or separators>
В свою очередь, опираясь на CHAR, CTL и разделители:
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
TEXT:
TEXT = <any OCTET except CTLs,
but including LWS>
Где LWS - линейный пробел,чье определение я не буду воспроизводить, а OCTET это:
OCTET = <any 8-bit sequence of data>
Есть примечание, сопровождающее определение:
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].
Итак, два вывода.Во-первых, ясно, что заголовок name должен состоять из подмножества символов ASCII - буквенно-цифровых символов, некоторых знаков препинания, а не чего-то еще.Во-вторых, в определении заголовка значение нет ничего, что ограничивало бы его ASCII или исключало бы 8-битные символы: оно явно состоит из октетов, только с запрещенными управляющими символами (обратите внимание, что CR и LF считаются элементами управления).Кроме того, комментарий к продукции TEXT подразумевает, что октеты должны интерпретироваться как находящиеся в ISO-8859-1, и что существует механизм кодирования (который, кстати, ужасен) для представления символов вне этой кодировки.
Итак, для ответа на @BalusC, в частности, совершенно очевидно, что согласно спецификации значения заголовков соответствуют ISO-8859-1.Я отправил символы высокого уровня 8859-1 (в частности, некоторые ударные гласные, как они используются на французском языке) в заголовке из Tomcat, и правильно интерпретировал их Firefox, так что в некоторой степени это работает на практике так же, как и в теории(хотя это был заголовок Location, который содержит URL-адрес, и эти символы недопустимы в URL-адресах, так что на самом деле это было недопустимо, но по другому правилу!).
Тем не менее, я бы не стал полагатьсяна ISO-8859-1, работающем на всех серверах, прокси и клиентах, так что я бы придерживался ASCII в качестве защитного программирования.