Что-то, что я до сих пор не понимаю, когда выполнение HTTP-запроса на сервере является преимуществом в использовании функции JS encodeURIcomponent для кодирования каждого компонента http-get .
Выполняя некоторые тесты, я видел, что сервер (используя PHP) правильно получает значения запроса http-get, если я не использую encodeURI Component! Очевидно, мне все еще нужно кодировать на уровне клиента специальный символ &? = /: иначе значение 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?
Это проблема кодирования символов ( снова ). Как заявила Габи, 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: представьте, что у вас есть веб-страница, на которой вы хотите ссылаться на статью Википедии на знаке Euro. Если вы просто напишете 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 (Wikipedia будет выбирать ISO 8859-1, поскольку 0xA4 является недопустимой последовательностью байтов в UTF-8 и HTTP определяет ISO 8859-1 как кодировку символов по умолчанию ).
Поэтому я рекомендую всегда использовать кодировку Percent, чтобы избежать ошибок . Не позволяйте агентам пользователей понять, что вы имеете в виду.
Это потому
Унифицированный идентификатор ресурса (URI) определен в [RFC3986] как последовательность символов, выбранных из ограниченного подмножества репертуара символов US-ASCII [ASCII] .
Поэтому официально unicode не поддерживается; см. RFC для деталей. Тем не менее, все современные браузеры поддерживают его, и именно поэтому вы получаете свои результаты просто отлично. Но для странного случая, когда какой-то браузер или система, которые его не поддерживают, вы кодируете его и следите за тем, чтобы он работал нормально во всех стандартно совместимых браузерах.