Это проблема кодировки символов ( снова ).Как заявил Габи, 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 в качестве кодировки символов по умолчанию ).
Поэтому я рекомендую всегда использовать процентное кодирование, чтобы избежать ошибок .Не позволяйте пользовательским агентам угадывать, что вы имеете в виду.