编码URL包含特殊字符

时间:2014-11-25 13:26:04

标签: ios objective-c special-characters encode nsurl

我有一个包含特殊字符的URL(非常使用%)..我想对URL进行编码,如何? 这是我的网址的一个示例:http://some.com//en/it/name-50%-other-set-50%-/68

我尝试了以下内容:

//  Option - 1.

NSString* str = [self.shareURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

//  Option - 2. 

NSString *unsafeString = @"this &string= confuses ? the InTeRwEbZ";
CFStringRef safeString = CFURLCreateStringByAddingPercentEscapes (
    NULL,
    (CFStringRef)unsafeString,
    NULL,
    CFSTR("/%&=?$#+-~@<>|\\*,.()[]{}^!"),
    kCFStringEncodingUTF8
);

//  Option - 3.

NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; 

2 个答案:

答案 0 :(得分:0)

如您所说,http://some.com//en/it/name-50%-other-set-50%-/68是一个糟糕的网址。你应该有什么好的网址?

为什么//在.com之后?

答案 1 :(得分:0)

按顺序解决三个变化:

  1. 使用stringByAddingPercentEscapesUsingEncoding非常方便,可以解决您的问题,其中包含%的网址。

    然而,这种方法非常有限,并没有解决许多常见的百分比逃逸问题。例如,如果您的好奇网址路径字符串中包含?,该怎么办?这种方法可以让问号不被转义(因为问号在URL中作为分隔请求参数开始的一种方式是有效的),如果您确实需要?作为一部分,这将是一个问题那条路。

    在实践中,虽然人们喜欢建议stringByAddingPercentEscapesUsingEncoding作为对逃避问题百分比的回应,但它总是无法提供足够的控制来充分完成工作。

  2. 这导致我们CFURLCreateStringByAddingPercentEscapes,这是提供更高级别控制的核心基础功能。在iOS 7之前,这是“转到”解决方案,允许您限定您可能想要另外转义的“合法字符”(例如,在我之前的示例中为?)。您还可以指定通常转义的字符,您可能希望不转义。

    关于这个函数示例的三个观察结果:

    • 您已指定要转义的大量字符,包括一些本来可以转义的字符。包含这些额外字符并没有什么坏处,但暗示对这个功能的作用有轻微的误解。

    • 同样,您要转义一些不需要转义的字符(.-~)。

    • 最后,当我们在Objective-C代码中使用此功能时,我们通常会将其作为NSString返回,并通过CFBridgingRelease__bridge_transfer转让所有权。这使我们不必处理Core Foundation类型并且必须手动CFRelease

    无论如何,这会产生类似的结果:

    - (NSString *)percentEscapeString:(NSString *)string
    {
        return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                         (CFStringRef)string,
                                                                         NULL,
                                                                         (CFStringRef)@":/?@!$&'()*+,;=",
                                                                         kCFStringEncodingUTF8));
    }
    

    顺便说一句,如果你执行这种百分比转义例程,请在URL的各个组件上执行(例如,只是名称中“50%”的路径部分),而不是整个URL。 URL中有一些有效的字符(例如/:),但在此路径中无效,因此您希望百分比在路径中转义这些字符,但不是URL作为一个整体。

  3. 这会引导我们stringByAddingPercentEncodingWithAllowedCharacters。在iOS 7中引入的这种方法提供了与上述Core Foundation功能相同的控制级别,但没有桥接的麻烦。只需选择合适的字符集,它就会从那里开始。