Elenco di caratteri validi per l'identificatore di frammento in un URL?


86

Sto usando l'identificatore di frammento per creare un permalink per gli eventi AJAX nella mia app web simile a questo ragazzo . Qualcosa di simile a:

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

Ho fatto un po 'di ricerche ma non riesco a trovare un elenco di caratteri validi per il frammento idenitifer. Le specifiche W3C non offrono nulla.

Devo codificare i caratteri come l'URL in generale?

Non sembra esserci alcuna buona informazione su questo da nessuna parte.

Risposte:


98

Vedi RFC 3986 .

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

Così si può utilizzare !, $, &, ', (, ), *, +, ,, ;, =, qualcosa di corrispondenza %[0-9a-fA-F]{2}, qualcosa di corrispondenza [a-zA-Z0-9], -, ., _, ~, :, @, /, e?


Perfetto, lo stavo cercando nella RFC ma non sono riuscito a trovare la clausola giusta. Grazie.
sohtimsso1970

1
@Artefacto, quindi significa che un "%" non è consentito ovunque, ma consentito solo quando due caratteri validi lo seguono?
Pacerier

1
@Pacerier sì, %è consentito solo come carattere di escape. Utilizzare %25per codificare un singolo file %.
gioele

1
Il pulsante Indietro / Avanti non funziona con gli identificatori di frammento che hanno i due punti nonostante la RFC affermi che è un carattere valido.
Vince

Wow! Probabilmente sarebbe più facile capire quali caratteri ASCII non possono essere usati!
e2-e4

30

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

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

e

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

Così, combinato, il frammento non può contenere #, una cruda %, ^, [, ], {, }, \, ", <e >secondo il RFC.


Grazie. Ho dato la risposta ad Artefacto poiché era un pelo più veloce ma ti ha dato +1 per la risposta.
sohtimsso1970

2
Suppongo che manchino caratteri ASCII non stampabili e caratteri non ASCII.
Artefacto

2
Sembra che hai dimenticato VERTICAL BAR (|)e GRAVE ACCENT (`)e SPACE ( )nel non-list. Quindi l'elenco completo dei caratteri US-ASCII stampabili (7 bit) nell'elenco non è:"#%< >[\]^`{|}
GitaarLAB

2

Un altro RFC parla di questo: RFC-1738

URL schemeparts for ip based protocols:
HTTP

httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
hpath          = hsegment *[ "/" hsegment ]
hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.