Lista prawidłowych znaków identyfikatora fragmentu w adresie URL?

86

Używam identyfikatora fragmentu, aby utworzyć link bezpośredni dla wydarzeń AJAX w mojej aplikacji internetowej, podobnie jak ten facet . Coś jak:

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

Zrobiłem sporo wyszukiwania, ale nie mogę znaleźć listy prawidłowych znaków dla identyfikatora fragmentu. Specyfikacja W3C niczego nie oferuje.

Czy muszę kodować znaki tak samo, jak ogólnie ma adres URL?

Wydaje się, że nigdzie nie ma dobrych informacji na ten temat.

sohtimsso1970
źródło

Odpowiedzi:

98

Zobacz RFC 3986 .

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

Więc można użyć !, $, &, ', (, ), *, +, ,, ;, =, dopasowanie coś %[0-9a-fA-F]{2}, coś dopasowanie [a-zA-Z0-9], -, ., _, ~, :, @, /, i?

Artefacto
źródło
Doskonale, szukałem tego w RFC, ale nie mogłem znaleźć odpowiedniej klauzuli. Dzięki.
sohtimsso1970
1
@Artefacto, Czy to oznacza, że ​​„%” nie jest dozwolone wszędzie, ale jest dozwolone tylko wtedy, gdy następują po nim dwa prawidłowe znaki?
Pacerier
1
@Pacerier tak, %jest dozwolony tylko jako znak ucieczki. Służy %25do kodowania pojedynczego %.
gioele
1
Przycisk Wstecz / Dalej nie działa z identyfikatorami fragmentów, które mają dwukropek, mimo że RFC stwierdza, że ​​jest to prawidłowy znak.
Vince
Łał! Prawdopodobnie łatwiej byłoby stwierdzić, jakich znaków ascii nie można używać!
e2-e4
30

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

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

i

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

Tak więc, w połączeniu, fragment może nie zawierać #, surowy %, ^, [, ], {, }, \, ", <i >, zgodnie z RFC.

kennytm
źródło
Dzięki. Dał odpowiedź Artefacto, ponieważ był o włos szybciej, ale dał ci +1 za odpowiedź.
sohtimsso1970
2
Przypuszczam, że brakuje niedrukowalnych znaków ASCII i znaków innych niż ASCII.
Artefacto
2
Wydaje się, że nie pamiętasz VERTICAL BAR (|), a GRAVE ACCENT (`)i SPACE ( )w nie listy. Tak więc pełna lista drukowalnych (7-bitowych) znaków US-ASCII na nie-liście to:"#%< >[\]^`{|}
GitaarLAB
2

Mówi o tym jeszcze jeden dokument RFC : RFC-1738

URL schemeparts for ip based protocols:
HTTP

httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
hpath          = hsegment *[ "/" hsegment ]
hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
sirkazey
źródło