Почему приведенный ниже код не выбрасывает URISyntaxException
во время выполнения как недопустимый URI?
new URI("http:us//er:ps//w@si//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");
// or same with "http:// ... "
new URI("http://us//er:ps//w@si//te.c/om/dir1/di//r2/fi//le.txt#frag//ment");
Согласно wikipedia"/
" является зарезервированным (специальным) символом ион должен быть закодирован в процентах (или URL-кодирован) как %2F
зарезервированный символ /
, например, если используется в компоненте «путь»URI имеет особое значение, являющееся разделителем между путями сегменты . Если в соответствии с заданной схемой URI, /
должен находиться в сегменте пути , , тогда три символа %2F
или %2f
должны использоваться всегмент вместо необработанного /
.
Но конструктор URI позволяет не кодировать его по URL-адресу!
Википедия определяет формат URI какследует ( RFC 3986 , раздел 3 (2005) ):
URI = scheme:[//authority]path[?query][#fragment]
И конструктор URI позволяет напрямую использовать /
(без кодирования в процентах) влюбой компонент (возможно, за исключением схемы).
URI Javadoc состояния :
Этот конструктор анализирует заданную строку точно так, как указано в RFC2396, Приложение A, за исключением следующих отклонений : ...
Символы в категории other разрешены везде, где RFC 2396 разрешает экранирование октетов , то есть в компонентах пользовательской информации, пути, запроса и фрагмента, а также в компоненте полномочий, еслиПолномочия основаны на реестре.Это позволяет URI содержать символы Unicode, которые не входят в набор символов US-ASCII.
Это позволяет использовать символы "Other", не закодированные в процентах (см. Выше ссылку на вики для зарезервировано / не зарезервировано /уточнение других символов ), например, ɷ (не ASCII), так что речь идет не о зарезервированных символах, таких как косая черта.
Но в любом случае - почему и для чего?почему мы можем использовать прямые косые черты в других компонентах, но почему мы можем использовать их в компоненте пути (имена каталогов, имена файлов), до сих пор неясно.
Зарезервированные символы, которые не имеют зарезервированной цели вконкретный контекст также может быть закодирован в процентах , но семантически не отличается от тех, которые не являются.
В компоненте "query" URI(часть после символа?), например, / по-прежнему считается зарезервированным символом , но обычно не имеет зарезервированной цели , , если только не определен URЯ схема говорит иначе .Символ не должен кодироваться в процентах, если он не имеет зарезервированной цели.