【问题标题】:List of valid characters for the fragment identifier in an URL?URL中片段标识符的有效字符列表?
【发布时间】:2011-02-20 10:36:03
【问题描述】:

我正在使用片段标识符在我的网络应用 similar to this guy 中为 AJAX 事件创建一个永久链接。比如:

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

我进行了大量搜索,但找不到片段标识符的有效字符列表。 W3C spec 不提供任何东西。

我是否需要将字符编码为与 URL 中的一般字符相同?

似乎没有任何关于这方面的好信息。

【问题讨论】:

    标签: fragment-identifier


    【解决方案1】:

    请参阅RFC 3986

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

    所以你可以使用!$&'()*+,=4, ,匹配%[0-9a-fA-F]{2},匹配[a-zA-Z0-9]-._~:@/,和?

    【讨论】:

    • 完美,我在 RFC 中寻找它,但似乎找不到正确的子句。谢谢。
    • @Artefacto,这是否意味着“%”不允许无处不在,但在两个有效字符后才允许?
    • @Pacerier 是的,% 只允许作为转义字符。使用%25 编码单个%
    • 后退/前进按钮不适用于带有冒号的片段标识符,尽管 RFC 声明它是有效字符。
    • 哇!可能更容易分辨出哪些 ascii 字符 不能 使用!
    【解决方案2】:

    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
    

    因此,结合起来,片段不能包含#、原始%^[]{}、@987654331 @、"<> 根据 RFC。

    【讨论】:

    • 谢谢。给了 Artefacto 的答案,因为他的速度更快,但给了你 +1 的回复。
    • 我想您缺少不可打印的 ASCII 字符和非 ASCII 字符。
    • 您似乎忘记了不在列表中的VERTICAL BAR (|)GRAVE ACCENT (`)SPACE ( )。因此,非列表中可打印(7 位)US-ASCII 字符的完整列表为:"#%< >[\]^`{|}
    【解决方案3】:

    另一个 RFC 提到了这一点:RFC-1738

    URL schemeparts for ip based protocols:
    HTTP
    
    httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
    hpath          = hsegment *[ "/" hsegment ]
    hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
    search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
    

    【讨论】:

      猜你喜欢
      • 2012-06-13
      • 2013-01-24
      • 2011-12-01
      • 2011-06-25
      • 2011-06-10
      • 2019-10-22
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      相关资源
      最近更新 更多