URL中片段标识符的有效字符列表是什么?

94

我正在使用片段标识符为我的Web应用中的AJAX事件创建永久链接,就像这个人一样。类似于:

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

我进行了相当多的搜索,但找不到片段标识符的有效字符列表。W3C规范没有提供任何信息。

在一般情况下,我是否需要像URL中一样对这些字符进行编码?

似乎没有任何好的信息可以在任何地方找到。

3个回答

112

请参阅RFC 3986

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

所以您可以使用 !, $, &, ', (, ), *, +, ,, ;, =, 与类似于 %[0-9a-fA-F]{2}、类似于 [a-zA-Z0-9] 的内容匹配、-, ., _, ~, :, @, /?


1
@Artefacto,这是否意味着“%”不是无处不在的,而只有在其后跟随两个有效字符时才被允许使用? - Pacerier
1
@Pacerier 是的,% 只能作为转义字符使用。使用 %25 对单个 % 进行编码。 - gioele
1
回退/前进按钮无法使用带有冒号的片段标识符,尽管RFC声明它是一个有效的字符。 - Vince
1
哇!可能更容易告诉我们不能使用哪些ASCII字符! - Déjà vu
所以...基本上是81进制。不是一个干净利落的使用方式... - William Entriken
显示剩余2条评论

32

https://www.rfc-editor.org/rfc/rfc3986#section-3.5:

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

并且

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

综合来看,根据RFC标准,该片段不能包含#、原始%^[]{}\"<>


谢谢。因为Artefacto回答得更快,所以我把答案给了他,但是我会给你一个赞作为回应。 - sohtimsso1970
2
我猜你缺少非打印ASCII字符和非ASCII字符。 - Artefacto
4
看起来你在 not-list 中忘记了“竖杠(|)”、“重音符号()”和“空格( )”。因此,not-list 中所有可打印的(7比特)美国标准信息交换码字符列表为:“#%< >[\]^{|}”。 - GitaarLAB

2

另外还有一份RFC提到了这个问题:RFC-1738

URL schemeparts for ip based protocols:
HTTP

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接