Какую кодировку символов следует использовать для заголовка HTTP? - PullRequest
109 голосов
/ 09 декабря 2010

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

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

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

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

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


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

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

Ответы [ 2 ]

108 голосов
/ 10 декабря 2010

Вкратце: гарантированно работает только 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?=

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

10 голосов
/ 19 июня 2012

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


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

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

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


Я хотел бы суммировать все соответствующие определения согласно 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 расшифровывается как Linear White Space. По сути, LWS - это пробел или табуляция, но вы можете разбить значение поля на несколько строк, начав новую строку перед пробелом или табуляцией.

Давайте упростим это до:

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

Теперь мы за field-content .

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...