Список допустимых символов для идентификатора фрагмента в URL?


86

Я использую идентификатор фрагмента, чтобы создать постоянную ссылку для событий AJAX в моем веб-приложении, похожую на этого парня . Что-то типа:

http://www.myapp.com/calendar#filter:year/2010/month/5

Я довольно много поискал, но не могу найти список допустимых символов для идентификатора фрагмента. Спецификация W3C ничего не предлагает.

Нужно ли мне кодировать символы так же, как в общем URL?

Похоже, нигде нет хорошей информации по этому поводу.

Ответы:


98

См. RFC 3986 .

fragment    = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"    
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

Таким образом , вы можете использовать !, $, &, ', (, ), *, +, ,, ;, =, что - то соответствие %[0-9a-fA-F]{2}, что - то соответствие [a-zA-Z0-9], -, ., _, ~, :, @, /, и?


Отлично, я искал это в RFC, но не мог найти нужного предложения. Спасибо.
sohtimsso1970

1
@Artefacto, Значит ли это, что "%" разрешен не везде, а только когда за ним следуют два допустимых символа?
Pacerier

1
@Pacerier да, %можно использовать только как escape-символ. Используйте %25для кодирования сингла %.
gioele 01

1
Кнопка назад / вперед не работает с идентификаторами фрагментов, в которых есть двоеточие, несмотря на то, что RFC заявляет, что это допустимый символ.
Винс

Вот это да! Было бы, наверное, проще сказать, какие символы ascii нельзя использовать!
e2-e4

30

http://tools.ietf.org/html/rfc3986#section-3.5 :

fragment    = *( pchar / "/" / "?" )

а также

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="
pct-encoded   = "%" HEXDIG HEXDIG

Таким образом, в сочетании, фрагмент может не содержать #, сырые %, ^, [, ], {, }, \, ", <и в >соответствии с RFC.


Спасибо. Дала ответ Артефакто, так как он был на волосок быстрее, но дал вам +1 за ответ.
sohtimsso1970

2
Я полагаю, вам не хватает непечатаемых символов ASCII и символов, отличных от ascii.
Артефакто

2
Кажется , что вы забыли VERTICAL BAR (|)и GRAVE ACCENT (`)и SPACE ( )в не-списке. Итак, полный список печатаемых (7-битных) символов US-ASCII в не-списке:"#%< >[\]^`{|}
GitaarLAB

2

Еще один RFC говорит об этом: RFC-1738

URL schemeparts for ip based protocols:
HTTP

httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
hpath          = hsegment *[ "/" hsegment ]
hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.