Какая правильная кодировка HTTP-строк запроса на получение? - PullRequest
20 голосов
/ 11 октября 2009

Стандарт HTTP или что-то определяет, какую кодировку следует использовать для специальных символов, прежде чем они будут кодированы в URL с% XXs? Если он не определяет, есть ли способ определить, какая кодировка используется? Похоже, что большинство браузеров отправляют данные в utf-8.

Ответы [ 3 ]

26 голосов
/ 11 октября 2009

Стандарт HTTP или что-то определяет, какую кодировку следует использовать для специальных символов, прежде чем они будут кодированы в URL с% XXs?

Стандарт HTTP, нет. Но другой стандарт, IRI, может вступить в игру.

URI - это явные (когда-то% -кодированные) байтовые последовательности. Какие символы Unicode отображают эти байты, не указано ни стандартом URI, ни стандартом HTTP для URI http: -scheme.

Специально для параметров запроса: веб-браузеры будут использовать кодировку исходной страницы для отправки формы GET URL, поэтому, если у вас есть страница в ISO-8859-1 и вы добавили «é» в поле поиска, вы Вы получите '? search =% E9', но если вы сделаете то же самое на странице, кодированной как UTF-8, вы получите '? search =% C3% E9'. Если вы не предоставите страницу формы с каким-либо конкретным набором символов, который будет угадывать браузер, а вы этого не хотите, так как это сделает невозможным угадать, в каком формате будет представлено представление.

Что касается других частей URL, браузер не будет генерировать их сам, но если вы предоставите ему символы, не входящие в ASCII, в ссылках, они обычно закодируют их как UTF-8. Это ненадежно, так как зависит от настроек браузера и локали, поэтому лучше не использовать это в данный момент.

Стандарт, который разрешает использование в ссылках не-ASCII символов, IRI . IRI преобразуется в URI с помощью UTF-8 -% - кодирования большей части URL-адреса, но имя хоста преобразуется с использованием Punycode . Для совместимости лучше не полагаться на браузеры, понимающие IRI в ссылках. Вместо этого UTF-8-then -% - кодируют ваш путь и символы параметров самостоятельно. Они по-прежнему будут отображаться как правильные символы в адресной строке в современных браузерах; к сожалению, IE не будет отображать форму IRI декодированного символа во всех случаях, в зависимости от языковых настроек.

Вики IRI для греческого гамма-символа:

http://en.wikipedia.org/wiki/Γ

Закодировано в URI, это:

http://en.wikipedia.org/wiki/%CE%93
1 голос
/ 11 октября 2009

за RFC 2616 ,

   CHAR           = <any US-ASCII character (octets 0 - 127)>

и

 token          = 1*<any CHAR except CTLs or separators>
   separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT

и URI token с различными определенными разделителями. Так что, теоретически, ничего кроме US-ASCII там быть не должно. (На практике, поскольку расширение ISO-8859-1 для US-ASCII используется во многих других местах в спецификациях HTTP, нет ничего необычного в том, чтобы найти реализации HTTP, которые поддерживают ISO-8859-1, а не только US-ASCII, но строго говоря, это не соответствует стандартам HTTP).

1 голос
/ 11 октября 2009

Насколько я знаю, нет никакого способа определить его, хотя я всегда предполагал, что это ASCII, поскольку это то, чем является DNS (в настоящее время, хотя приходит локализованный DNS, со всеми проблемами, которые влечет за собой).

Примечание: UTF8 «ASCII-совместим», если вы не пытаетесь использовать расширенные символы. Это, вероятно, играет небольшую роль в обосновании того, почему некоторые браузеры могут отправлять свои данные GET в кодировке UTF8.

РЕДАКТИРОВАТЬ: Из вашего комментария кажется, что вы вообще не знаете, как работает кодировка%, так что здесь.

Учитывая следующую строку запроса, "?foo=Hello World!", «Hello World!» часть нуждается в кодировке URL. Это работает так, что любые «специальные» символы получают значение ASCII, которое преобразуется в гекс с префиксом '%'. Таким образом, приведенная выше строка будет преобразована в "?foo=Hello%20World%21".

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