Catch 22 of Cocoa URL encoding



在检查了其他人如何在Cocoa中进行URL编码后(如如何对字符串进行URL编码、Swift-encode URL等),如果

  • URL来自外部,因此其结构(部分)未知
  • 可以是编码的或纯URL字符串
  • BONUS可以是相对和本地文件URL
  • 我不想总是盲目地编码所有字符,而是根据rfc3986(rfc2396,rfc1738,rfc1808)

陷阱22:

  • stringByAddingPercentEscapesUsingEncoding:延迟转换,因此优选的方法是对每个url组件逐一使用stringByAddingPercentEncodingWithAllowedCharacters:

  • 如果传入字符串未(至少部分)编码,则[NSURL URLWithString:][NSURLComponents componentsWithString:]和同伴将失败,但如果我通过stringByAddingPercentEscapesUsingEncoding:编码的字符串,则组件拆分将失败(例如,编码的#将混淆拆分器,并且片段将被视为可能的查询部分的一部分

在这种情况下,如何在不编写自己的URL解析器、编码器的情况下正确地进行URL编码?

你应该阅读苹果关于这个主题的所有发布说明讨论,但特别是这部分可能与你的情况最相关:

如果你需要对整个URL字符串进行百分比编码,你可以使用用于编码打算作为URL的NSString的代码(在urlStringToEncode中):

    NSString *percentEncodedURLString =
       [[NSURL URLWithDataRepresentation:[urlStringToEncode dataUsingEncoding:NSUTF8StringEncoding] relativeToURL:nil] relativeString];

(相当于URLWithDataRepresentation的CoreFoundation:CFURLCreateWithBytes()使用编码kCFStringEncodingUTF8如果kCFStringEncodingUTF8,则回退到kCFStringEncodingISOLatin1失败。)

基本上,+URLWithDataRepresentation:relativeToURL:尽其所能从提供的字节中生成一个合适的URL。考虑到你几乎不能保证输入的任何内容,就不可能有任何承诺说它会"正确"(因为在这种情况下"正确"没有很好的定义),但这可能是你最大的希望。

最新更新