Lista de caracteres válidos para o identificador de fragmento em um URL?

86

Estou usando o identificador de fragmento para criar um permalink para eventos AJAX em meu aplicativo da web semelhante a esse cara . Algo como:

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

Fiz muitas pesquisas, mas não consigo encontrar uma lista de caracteres válidos para o identificador do fragmento. A especificação W3C não oferece nada.

Preciso codificar os caracteres da mesma forma que o URL em tem em geral?

Não parece haver nenhuma boa informação sobre isso em qualquer lugar.

sohtimsso1970
fonte

Respostas:

98

Consulte o RFC 3986 .

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

Assim você pode usar !, $, &, ', (, ), *, +, ,, ;, =, algo correspondência %[0-9a-fA-F]{2}, algo correspondência [a-zA-Z0-9], -, ., _, ~, :, @, /, e?

Artefacto
fonte
Perfeito, eu estava procurando por isso na RFC, mas não consegui encontrar a cláusula certa. Obrigado.
sohtimsso1970
1
@Artefacto, isso significa que um "%" não é permitido em todos os lugares, mas apenas permitido quando dois caracteres válidos o seguem?
Pacerier
1
@Pacerier sim, %só é permitido como um caractere de escape. Use %25para codificar um único %.
gioele 01 de
1
O botão voltar / avançar não funciona com identificadores de fragmento que possuem dois pontos, apesar do RFC declarar que é um caractere válido.
Vince
Uau! Seria provavelmente mais fácil saber quais caracteres ASCII não podem ser usados!
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

Assim, combinados, o fragmento não pode conter #, uma matéria %, ^, [, ], {, }, \, ", <e >de acordo com a RFC.

Kennytm
fonte
Obrigado. Deu a resposta para Artefacto já que ele era um fio de cabelo mais rápido, mas deu +1 pela resposta.
sohtimsso1970
2
Suponho que você esteja perdendo caracteres ASCII não imprimíveis e caracteres não ASCII.
Artefacto
2
Parece que você esqueceu VERTICAL BAR (|)e GRAVE ACCENT (`)e SPACE ( )na lista não. Portanto, a lista completa de caracteres US-ASCII imprimíveis (7 bits) na lista não é:"#%< >[\]^`{|}
GitaarLAB
2

Uma outra RFC fala disso: RFC-1738

URL schemeparts for ip based protocols:
HTTP

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