encodeURIComponent действительно полезен? - PullRequest
3 голосов
/ 10 февраля 2010

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 10 февраля 2010

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

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

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

5 голосов
/ 11 апреля 2010

Это проблема кодировки символов ( снова ).Как заявил Габи, 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 в качестве кодировки символов по умолчанию ).

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

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