捕获Cocoa URL编码22

时间:2016-05-05 14:21:55

标签: cocoa urlencode

在检查其他人如何尝试在Cocoa中进行URL编码(如How do I URL encode a stringSwift - encode URL等)后,我仍然不知道如何在Cocoa中正确进行URL编码

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

捕获22:

  • stringByAddingPercentEscapesUsingEncoding:懒惰转换,因此首选方法是逐个使用stringByAddingPercentEncodingWithAllowedCharacters:每个网址组件

  • [NSURL URLWithString:][NSURLComponents componentsWithString:],如果传入的字符串不是(至少部分地)编码,则同伴会失败,但如果我传递的stringByAddingPercentEscapesUsingEncoding:编码字符串不是组件拆分将失败(fe编码的#将混淆分割器,片段将被视为可能的查询部分

在这种情况下如何正确编码URL而不编写我自己的URL解析器,编码器?

1 个答案:

答案 0 :(得分:2)

您应该阅读本主题的所有Apple's release note discussion,但特别是此部分可能与您的案例最相关:

  

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

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

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

基本上,+URLWithDataRepresentation:relativeToURL:会尽力从提供的字节中生成正确的URL。鉴于你几乎无法保证任何关于输入的内容,所以它不会有任何承诺它会得到它"对" (因为"右边"在这种情况下没有明确定义),但它可能是你最好的希望。