【问题标题】:Is a custom URI scheme allowed to use the hash/pound sign (#) for it's content?自定义 URI 方案是否允许对其内容使用井号/井号 (#)?
【发布时间】:2015-09-29 15:04:27
【问题描述】:

在 Kullo,我们使用username#domain.tld 格式的地址(例如hi#kullo.net),其中# 是一个常量,类似于电子邮件地址中的@

现在设计用于向给定地址发送消息的正确 URI 格式是什么:

kullo:username#domain.tldkullo:username%23domain.tld?

首选第一个,因为它很简单。但是考虑到 URI 的规则,我是否可以为我的自定义方案 kullo 制作除片段分隔符之外的 # 吗?

【问题讨论】:

    标签: android url uri


    【解决方案1】:

    根据RFC 3986,井号是保留的,但这并不意味着自定义 URI 方案必须使用它作为分隔符:

    2.2。保留字符

    URI 包括由以下分隔的组件和子组件 “保留”集中的字符。这些字符被称为 “保留”,因为它们可能(或可能不)被定义为分隔符 通用语法,由每个特定于方案的语法,或由 URI 的解引用算法的特定于实现的语法。 如果 URI 组件的数据与保留的 字符作为分隔符的目的,那么冲突的数据必须是 在形成 URI 之前进行百分比编码。

    [...]

    因此,保留集中的字符受到保护 规范化,因此可以安全地被特定方案使用 用于分隔数据子组件的特定于生产者的算法 在 URI 中。

    [...]

    URI 生成应用程序应该对数据字节进行百分比编码 对应于保留集中的字符,除非这些字符 URI 方案特别允许在其中表示数据 零件。如果在 URI 组件中找到保留字符并且 该字符没有已知的分隔角色,那么它必须是 解释为表示对应的数据八位字节 字符的 US-ASCII 编码。

    所以你可以决定不转义它,但你会失去规范化功能:

    kullo:username#domain.tld != kullo:username%23domain.tld
    

    但是

    kullo:username#domain.tld == kullo:%75sername#domain.tld
    

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多