【问题标题】:Why does NSURL parse strings with a double forward slash after the scheme differently to a string with a single forward slash?为什么 NSURL 在方案之后解析带有双斜杠的字符串与带有单个正斜杠的字符串不同?
【发布时间】:2014-01-02 00:05:58
【问题描述】:

在将字符串解析为 NSURL 对象时,NSURL 将使用单个正斜杠的字符串与在方案后使用双正斜杠的字符串区别对待。

为什么会这样?

这里有一些例子:

NSURL *url = [NSURL URLWithString:@"app-id://path1/path2"];

NSLog(@"%@",url.scheme);    // "app-id"
NSLog(@"%@",url.path);      // "/path2"
NSLog(@"%@",url.host);      // "path1"


NSURL *url = [NSURL URLWithString:@"app-id:/path1/path2"];

NSLog(@"%@",url.scheme);    // "app-id"
NSLog(@"%@",url.path);      // "/path1/path2"
NSLog(@"%@",url.host);      // nil

【问题讨论】:

  • 有趣的是,:// 之前的任何内容都被视为方案,即您可以编写“giberish://path1/path2”然后乱码将是您的方案。通常是http。

标签: ios cocoa nsurl core-foundation nsurlcomponents


【解决方案1】:

这两个字符串的处理方式不同,因为带有// 的第一个字符串符合RFC 1808 而第二个字符串不符合。

第一个字符串是标准 Internet URL,第二个字符串省略了“授权组件”(请参阅​​RFC 2396 Section 3.2)并立即开始路径组件,因此不符合 RFC 1808。

RFC1808

RFC 1808 定义了“相对统一资源定位器”,这是当今最熟悉的 URI,并使用 // 格式:

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>

//&lt;net_loc&gt; 是 1808 的必需组件,RFC 2396 声明 // 之后的组件称为 Authority Component(参见第 3.2 节),它充当路径的顶部元素或命名空间。路径从下一个正斜杠开始。

权限组件前面有一个双斜杠“//”,并且是 由下一个斜杠“/”、问号“?”或结尾 URI。

单斜杠

使用单个正斜杠会省略 Authority Component 并立即启动路径组件。

NSURL

NSURL 将 URL 的 Authority Component 公开为 host 参数,并提到它仅作为符合 1808 的 URL 的一部分提供:

[主机] 返回值

URL 的主机。如果接收方不符合 RFC 1808,则返回 nil。

这就是为什么NSURL 对待它们的方式不同,为什么主机组件在第二种情况下是nil 以及为什么路径包含冒号后面的所有内容。

【讨论】:

  • scheme:/foo/bar 形式的 URL 的处理有点模糊不同的实现如何选择实现它。查看NSURLComponents(或我的KSURLComponents克隆,如果您需要支持较旧的操作系统版本)可能值得您查看,它选择与NSURL略有不同的处理方式。
  • 啊,说得好。似乎 Apple 忘记了明确记录 NSURLComponents 使其更难被发现。 NSHipster/ios7 有简要概述,NSURL.h 有合理的内联文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2011-10-04
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多