Подтвердить что ты не робот

Какая правильная кодировка HTTP запрашивает строки запроса?

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

4b9b3361

Ответ 1

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

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

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

В частности, для параметров запроса: веб-браузеры будут использовать кодировку исходной страницы, чтобы сделать отправку формы GET URL, поэтому, если у вас есть страница в ISO-8859-1, и вы помещаете 'é в поле поиска, вы будете get '? 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 Wiki для греческого гамма-символа:

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

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

http://en.wikipedia.org/wiki/%CE%93

Ответ 2

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

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

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

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

Ответ 3

Per 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).