Я проверил это, запросив мой веб-сайт (apache) со всеми доступными символами на моей немецкой клавиатуре в качестве параметра URL:
http://example.com/?^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=? `QWERTZUIOPÜ*ASDFGHJKLÖÄ\'>YXCVBNM;:_²³{[]}\|µ@€~
Они не были закодированы:
^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-!/()=?`*;:_{}[]\|~
Не кодируется после urlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_
Не кодируется после rawurlencode()
:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~
Примечание: до PHP 5.3.0 rawurlencode()
кодируется ~
из-за RFC 1738 . Но это было заменено RFC 3986, так что теперь его безопасно использовать. Но я не понимаю, почему, например {}
, кодируются через, rawurlencode()
потому что они не упомянуты в RFC 3986.
Дополнительный тест, который я сделал, касался автоматического связывания в почтовых текстах. Я протестировал Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de и yahoo.de, и они полностью связали URL-адреса, содержащие эти символы:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~+#,%&=*;:@
Конечно ?
, он тоже был связан, но только если он использовался один раз.
Некоторые люди теперь предлагают использовать только rawurlencode()
символы, но слышали ли вы когда-нибудь, что у кого-то были проблемы с открытием этих сайтов?
Звездочка
http://wayback.archive.org/web/*/http://google.com
Колон
https://en.wikipedia.org/wiki/Wikipedia:About
Плюс
https://plus.google.com/+google
При знаке, двоеточии, запятой и восклицательном знаке
https: //www.google.com/maps/place/USA/@36.2218457, ...
Из-за этого эти символы должны быть пригодны для использования без кодирования без проблем. Конечно, вы не должны использовать &;
из-за последовательности кодирования, как &
. Эта же причина действительна для того, %
что она используется для кодирования символов в целом. И так =
как он присваивает значение имени параметра.
Наконец, я бы сказал, что можно использовать эти незакодированные:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-_~!+,*:@
Но если вы ожидаете случайно сгенерированные URL-адреса, вы не должны их использовать .!
, поскольку они отмечают конец предложения, а некоторые почтовые приложения не будут автоматически связывать последний символ URL-адреса . Пример:
Visit http://example.com/foo=bar! !
!*'();:@&=+$,/?#[]
либо незарезервированнымиA-Za-z0-9_.~-
(или символом процента%
как частью кодировки процента)