【问题标题】:Encode URL contains special characters编码 URL 包含特殊字符
【发布时间】:2014-11-25 13:26:03
【问题描述】:

我有一个包含特殊字符的 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]]; 

【问题讨论】:

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


    【解决方案1】:

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

    为什么在.com 之后有//?

    【讨论】:

    • 是的..你是对的,我不知道我以前是怎么想出来的,谢谢
    【解决方案2】:

    按顺序处理您的三个变体:

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

      但是,这种方法非常有限,并不能解决许多常见的百分比转义问题。例如,如果您好奇的 URL 路径字符串中包含 ? 怎么办?此方法将使该问号不转义(因为问号在 URL 中作为分隔请求参数开始的一种方式是有效的),如果您真的需要 ? 作为其中的一部分,这将是一个问题小路。

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

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

      不过,对您的此函数示例的三个观察结果:

      • 您指定了一大组要转义的字符,包括一些本来会被转义的字符。包含这些额外的字符并没有什么坏处,但表明对这个函数的作用有一点误解。

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

      • 最后,当我们在我们的 Objective-C 代码中使用这个函数时,我们一般会将它作为NSString 返回,并用CFBridgingRelease__bridge_transfer 转移所有权。这使我们不必处理核心基础类型,也不必手动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 功能相同的控制级别,但没有桥接的麻烦。只需选择适当的字符集,它就会从那里开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-03
      • 2014-09-17
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多