2012-01-12 4 views
22

При отладке в ASP.NET MVC, я не вижу разницы между:Зачем кодируется URL-адрес запятой?

http://mysite.com?q=hi,bye 

и

http://mysite.com?q=hi%2Cbye 

строки запроса парам «д» всегда имеет значение «привет, до свидания» ,

Так почему же запятая закодирована?

Я хочу сделать что-то вроде этого https://stackoverflow.com/a/752109/173957.

я иметь такую ​​форму:

<form method="GET" action="/Search"> 
    <input type="hidden" name="q" value="hi,bye"/> 
    <input type="submit" value="ok"/> 
</form> 

Как я могу предотвратить это значение из кодируемого?

+3

* Почему вы хотите предотвратить его кодирование? ASP.NET автоматически расшифрует его для вас, так что в чем проблема? – Jon

+2

Я полагаю? Q = hi, bye немного читаем, чем? Q = hi% 2Cbye. Кроме того, мне в основном просто любопытно. –

+0

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

ответ

16

Спецификация URI, RFC 3986, указывает, что компоненты пути URI не содержат незашифрованных зарезервированных символов и запятую, является одним из зарезервированных символов. Для сублимиты, такие как запятая, оставляя ее незанятой, подвергает риску символ, который рассматривается как синтаксис разделителя в схеме URI. Процентное кодирование гарантирует, что символ будет передан как данные.

+23

В этом вопросе запятая отсутствует в компоненте пути URI, но в компоненте запроса URI, который, согласно RFC 3986, может содержать подделимы, которые включают запятую. –

+0

Если я правильно читаю спецификацию: 'path = path-absolute' =>' path-absolute = "/" [segment-nz * ("/" segment)] '=>' segment = * pchar' => ' pchar = unreserved/pct-encoded/sub-delims/":"/"@" '=>' sub-delims = "!"/"$"/"&"/"'"/"("/")"/"*"/"+"/","/";"/"=" '. Таким образом, запятая является действительной в сегменте, запросе или фрагменте URI. – joeyhoer

2

Это действительно зависит от браузера. Браузер принимает форму HTML и решает, как создать URL-адрес на основе входных данных формы.

Если вы используете действительно старый (или плохо запрограммированный) браузер, он не может кодировать запятую. Если вы придерживаетесь стандартов RFC, это действительно должно быть закодировано.

Если вы хотите, чтобы запятая не была закодирована для всех браузеров, вам придется использовать JavaScript и самостоятельно создать URL.

<script lang="JavaScript"> 
    document.location.href = "/Search?q=hi,bye"; 
</script> 

В любом случае, это не имеет значения, потому что вы должны декодировать параметры строки запроса в любом случае, результат будет таким же.

+0

Да, использование js, безусловно, позволит предотвратить кодирование параметров запроса. –

-1

Есть несколько символов, которые имеют особое значение (например, +? # И т. Д.) Или прямо не разрешены (например, пробел, запятая и т. Д.) В URL-адресе. использовать такие символы в URL-адресе, и вам нужно их кодировать и декодировать. Read more Here

ASP.NET автоматически кодирует и декодирует все необходимые символы, так что вам не нужно беспокоиться о них.

+1

Но на самом деле не имеет смысла, что запятая закодирована. Даже в ссылке, которую вы предоставляете, запятая не упоминается как незаконный символ. Даже в том, что вы указали, «привет, до свидания» не отличается от кодировки. –

+2

Запятая имеет особое значение в URL-адресах, поскольку она обозначает параметры сегмента. См. Ссылку [это] (http://en.wikipedia.org/wiki/URI_scheme#Official_IANA-registered_schemes). Ищите схемы данных, гео и ldap. –

7

Я нашел этот список символов, которые не требуют URL кодирования: http://web.archive.org/web/20131212154213/http://urldecoderonline.com/url-allowed-characters.htm

Update
Поскольку исходная ссылка сломалась, я использовал архив.орг, чтобы получить следующий текст на странице с декабря 2013 года

Список разрешенных символов URL

нефиксированной - Может быть закодированы, но не надо

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
0 1 2 3 4 5 6 7 8 9 - _ . ~ 

Зарезервировано - Должны быть закодированы иногда

! * ' () ; : @ & = + $ ,/? % # [ ] 
+2

Больше не работает, страница заменена рекламным сайтом. –

Смежные вопросы