Какую кодировку символов я должен использовать для заголовка HTTP?

Я использую "забавный" специальный HTML-символ (✰) (см. http://html5boilerplate.com/ для получения дополнительной информации) для Server HTTP-заголовок, и мне интересно, разрешено ли это для каждой спецификации.

  • Использование вкладки "Сеть" в инструментах "dev" в Chrome на Windows Xp Pro SP 3 Я вижу, что "отлично".

  • В IE8 ✰ не отображается правильно.

  • Валидатор w3.org HTML не отображает его правильно (вместо этого отображает "â°" ).

Теперь я не слишком увлекаюсь кодировкой символов... и, откровенно говоря, я не очень-то люблю их; Я просто слепо использую UTF-8 cus, о котором мне говорят.: -)


Является ли несоответствие, вызванное ошибками в разных синтаксических анализах/браузерах/механизмах/(независимо от их имен)?

Есть ли спецификация для этого или, возможно, список допустимых символов для HTTP-заголовка "значение"?

Ответ 1

Вкратце: гарантируется только ASCII. Некоторые байты, отличные от ASCII, допускаются для обратной совместимости, но не должны отображаться.

HTTPbis отказался и указал, что в заголовках нет полезной кодировки помимо ASCII:

Исторически, HTTP разрешил содержимое поля с текстом в    Шифр ISO-8859-1 [ISO-8859-1], поддерживающий только другие кодировки    посредством использования кодировки [RFC2047]. На практике большинство HTTP-заголовков    значения поля используют только подмножество кодировки US-ASCII [USASCII].    Новые поля заголовков ДОЛЖНЫ ограничивать свои значения полей    Октеты US-ASCII. Получатель ДОЛЖЕН относиться к другим октетам в поле    (obs-text) как непрозрачные данные.


Ранее RFC 2616 с 1999 года определял это:

Слова * ТЕКСТ МОЖЕТ содержать символы из наборов символов, отличных от ISO-    8859-1 [22] только при кодировании в соответствии с правилами RFC 2047 [14].

и RFC 2047 - это MIME-кодирование, поэтому это будет:

=?UTF-8?Q?=E2=9C=B0?=

но я не думаю, что многие (если есть) клиенты поддерживают его.

Ответ 2

Пожалуйста, сначала прочитайте комментарии, этот ответ, вероятно, делает неправильные выводы из правильных источников, нуждается в редактировании.


Вы можете использовать любые печатные символы ASCII, а не специальные символы, такие как ✰ (что не является ASCII)

Совет: вы можете закодировать что-нибудь в JSON.

Изменить: сначала не может быть очевидным, кодировка символов, определенная в заголовке, применяется только для тела ответа, а не для самого заголовка. (Так как это вызовет проблему с цыпленком & -egg.)


Я хотел бы подытожить все соответствующие определения в соответствии с spec, связанным с Penchant.

message-header = field-name ":" [ field-value ]
field-name     = token
field-value    = *( field-content | LWS )

Итак, мы после значения поля.

LWS            = [CRLF] 1*( SP | HT )
CRLF           = CR LF
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)>

LWS означает линейное белое пространство. По сути, LWS - это Space или Tab, но вы можете разбить значение поля на несколько строк, запустив новую строку перед пробелом или вкладкой.

Пусть это упростит это:

field-value    = <any field-content or Space or Tab>

Теперь мы получаем полевое содержание.

field-content  = <the OCTETs making up the field-value
                 and consisting of either *TEXT or combinations
                 of token, separators, and quoted-string>
OCTET          = <any 8-bit sequence of data>
TEXT           = <any OCTET except CTLs,
                 but including LWS>
CTL            = <any US-ASCII control character
                 (octets 0 - 31) and DEL (127)>
token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@"
                 | "," | ";" | ":" | "\" | <">
                 | "/" | "[" | "]" | "?" | "="
                 | "{" | "}" | SP | HT

ТЕКСТ является самым общим и включает в себя все остальное - так же забывайте о остальных. Вот кодировка US-ASCII (= ASCII)

Как вы можете видеть, разрешены все печатные символы ASCII.