Формат заголовків 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 = <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].
Отже, два висновки. По-перше, зрозуміло, що заголовок ім'я повинно складатися з підмножини символів ASCII - буквено-цифрових знаків, деяких пунктуацій, не багато іншого. По-друге, у визначенні значення заголовка немає нічого, що обмежує його на ASCII або виключає 8-бітові символи: воно явно складається з октетів, лише заборонені символи управління (зауважте, що CR та LF вважаються елементами управління). Крім того, коментар до виробництва TEXT передбачає, що октети слід інтерпретувати як такі, що знаходяться в ISO-8859-1, і що існує механізм кодування (який, до речі, жахливо) для представлення символів поза цим кодуванням.
Отже, щоб реагувати на @BalusC, зокрема, цілком зрозуміло, що згідно зі специфікацією, значення заголовків знаходяться в ISO-8859-1. Я надсилав символи високого рівня 8859-1 (зокрема, деякі голосні наголошені, як це використовується французькою мовою), в заголовку з Tomcat, і їх інтерпретував Firefox правильно, так що певною мірою це працює як на практиці, так і в теорії (хоча це був заголовок Location, який містить URL-адресу, і ці символи не є законними в URL-адресах, тому це було фактично незаконно, але за іншим правилом!).
Втім, я не покладаюся на ISO-8859-1, що працює на всіх серверах, проксі-серверах та клієнтах, тому я б дотримувався ASCII як питання оборонного програмування.