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.

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?


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.


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 | ";" | ":" | "@" | "&" | "=" ]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.