encodeURIComponent действительно полезен?

Что-то, что я до сих пор не понимаю при выполнении запроса http-get к серверу, это в чем преимущество использования JS-функции encodeURIcomponent для кодирования каждого компонента http-get.

Выполняя некоторые тесты, я увидел, что сервер (использующий PHP) правильно получает значения запроса http-get, даже если я не использую encodeURIcomponent! Очевидно, мне все еще нужно кодировать на уровне клиента специальный символ & ? = / : в противном случае значение http-get, подобное этому «мир и любовь = добродетель», будет рассматриваться как новая пара значений ключа запроса http-get вместо одного единственного значения. Но почему encodeURIcompenent также кодирует многие другие символы, такие как, например, 'è', который переводится в %C3%A8, который должен быть декодирован на сервере PHP с помощью функции utf8_decode.

При использовании компонента encodeURIcomponent все значения запроса http-get кодируются в кодировке utf8, поэтому при их получении в PHP мне приходится каждый раз вызывать функцию utf8_decode для каждого значения $_GET, что довольно раздражает.

Почему мы не можем просто закодировать только & ? = / : символы?

см. также: результат JS encodeURIComponent отличается от созданного FORM Это показывает, что encodeURIComponent даже не кодирует должным образом, потому что простая браузерная FORM GET кодирует символы, такие как '€', по-другому. Так что мне все еще интересно, для чего нужен этот encodeURIComponent?


person Marco Demaio    schedule 10.02.2010    source источник


Ответы (2)


Это проблема с кодировкой символов (снова). Как заявил Габи, URI представляют собой последовательность символов ASCII (таким образом, только байты в диапазоне 0–127). Таким образом, любой другой символ, который не находится в ASCII, должен быть закодирован с помощью Percent-Encoding .

А поскольку UTF-8 — это новая «универсальная кодировка символов», в настоящее время пользовательские агенты интерпретируют URI как кодировку UTF-8. Но эти слова в кодировке UTF-8 сами также кодируются с помощью Percent-Encoding, поскольку URI не могут содержать никаких других символов, кроме символов ASCII.

Это означает, что когда вы вводите http://en.wikipedia.org/wiki/€ в поле адреса вашего браузера, ваш браузер ищет код UTF-8 для (0xE282AC) и применяет к нему процентное кодирование (%E2%82%AC). Таким образом, http://en.wikipedia.org/wiki/€ на самом деле приведет к http://en.wikipedia.org/wiki/%E2%82%AC.

Чтобы показать вам, что это правда, просто введите http://en.wikipedia.org/wiki/%E2%82%AC в поле вашего адреса, и ваш браузер, вероятно, превратит его в http://en.wikipedia.org/wiki/€. Это связано с тем, что в настоящее время пользовательские агенты интерпретируют URI как кодировку UTF-8.

Теперь вернемся к вашему первоначальному вопросу, почему вы должны явно применять Percent-Encoding: представьте, что у вас есть веб-страница, на которой вы хотите разместить ссылку на статью в Википедии о знаке евро. Если вы просто напишите URI с помощью простого :

<a href="http://en.wikipedia.org/wiki/€">Euro sign</a>

Ваш браузер будет использовать кодировку документа для символа . Это означает, что если ваш документ имеет кодировку Windows-1252 (как в вашем другом вопросе), будет закодирован как 0x80, а URI будет http://en.wikipedia.org/wiki/%80 (на самом деле это работает, потому что Википедия очень умна, чтобы догадаться, поскольку Windows-1252 — самая популярная кодировка символов с печатным символом на 0x80).

Но если кодировка вашего документа — ISO 8859-15, будет закодирован как 0xA4, который представляет знак валюты ¤ в ISO 8859-1 (Википедия выберет ISO 8859-1, поскольку 0xA4 является недопустимой последовательностью байтов в UTF-8 и HTTP указывает ISO 8859-1 как кодировку символов по умолчанию).

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

person Gumbo    schedule 11.04.2010

Это потому, что

Универсальный идентификатор ресурса (URI) определяется в [RFC3986] как последовательность символов, выбранных из ограниченного набора символов US-ASCII [ASCII].

Так что официально юникод не поддерживается; подробности см. в RFC. Тем не менее, все современные браузеры поддерживают его, и именно поэтому вы получаете свои результаты просто отлично.. но для странного случая, когда какой-то браузер или система не поддерживает его, вы кодируете его и убедитесь, что он нормально работает во всех стандартных совместимых браузерах.

person Gabriele Petrioli    schedule 10.02.2010
comment
То есть вы в основном говорите, что в наши дни я мог бы избежать использования encodeUriCompenent? И просто закодируйте специальные символы: '&', '?', '=', '/', ':'. Это в основном будет работать для подавляющего большинства браузеров в наши дни. - person Marco Demaio; 11.02.2010
comment
Это будет работать в большинстве браузеров.. но имейте в виду, что URL-адреса также публикуются внутри форумов/блогов/и т. д., и если этот форум/блог/и т. д. не в Unicode, URL-адрес внутри (предположительно, ссылка на ваш сайт) может запутаться.. - person Gabriele Petrioli; 11.02.2010