Liste des caractères valides pour l'identifiant de fragment dans une URL?

86

J'utilise l'identifiant de fragment pour créer un permalien pour les événements AJAX dans mon application Web similaire à ce type . Quelque chose comme:

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

J'ai fait pas mal de recherches mais je ne trouve pas de liste de caractères valides pour l'idenitifer de fragment. La spécification W3C n'offre rien.

Dois-je encoder les caractères de la même manière que l'URL en général?

Il ne semble y avoir aucune bonne information à ce sujet nulle part.

sohtimsso1970
la source

Réponses:

98

Voir la RFC 3986 .

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

Vous pouvez donc utiliser !, $, &, ', (, ), *, +, ,, ;, =, correspondant quelque chose %[0-9a-fA-F]{2}, correspondant quelque chose [a-zA-Z0-9], -, ., _, ~, :, @, /et?

Artefacto
la source
Parfait, je cherchais cela dans la RFC mais je n'arrivais pas à trouver la bonne clause. Merci.
sohtimsso1970
1
@Artefacto, cela signifie-t-il qu'un "%" n'est pas autorisé partout, mais uniquement autorisé lorsque deux caractères valides le suivent?
Pacerier
1
@Pacerier oui, %n'est autorisé que comme caractère d'échappement. Utilisez %25pour encoder un seul %.
gioele
1
Le bouton Précédent / Suivant ne fonctionne pas avec les identificateurs de fragment qui ont un deux-points malgré que la RFC déclare que c'est un caractère valide.
Vince
Hou la la! Il serait probablement plus facile de dire quels caractères ascii ne peuvent pas être utilisés!
e2-e4
30

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

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

et

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

Ainsi, combiné, le fragment ne peut pas contenir #, une brute %, ^, [, ], {, }, \, ", <et >selon la RFC.

KennyTM
la source
Merci. A donné la réponse à Artefacto car il était un cheveu plus rapide mais vous a donné +1 pour la réponse.
sohtimsso1970
2
Je suppose qu'il vous manque des caractères ASCII non imprimables et des caractères non-ascii.
Artefacto
2
Il semble que vous avez oublié VERTICAL BAR (|)et GRAVE ACCENT (`)et SPACE ( )dans la liste des non-inscrits. Ainsi, la liste complète des caractères US-ASCII imprimables (7 bits) dans la liste des non-listes est:"#%< >[\]^`{|}
GitaarLAB
2

Une autre RFC en parle: RFC-1738

URL schemeparts for ip based protocols:
HTTP

httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
hpath          = hsegment *[ "/" hsegment ]
hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
Sirkazey
la source