【问题标题】:Unable to create NSUrl from NSString always getting nil无法从 NSString 创建 NSUrl 总是为零
【发布时间】:2013-10-29 09:58:12
【问题描述】:
NSMutableString *string = [[NSMutableString alloc]initWithString:
@"http%3A%2F%2Fsupport24hour.com%2Fworkplace2%2Fbuttler%2Fimage.php%3Fwidth%3D534%26height%3D256%26image%3Duploads%2Fdeals%2FdealImage%2Fdeal_1383005121_IGA+Logo.JPG"];

[string replaceOccurrencesOfString:@"+" withString:@" " options:NSCaseInsensitiveSearch range:NSMakeRange(0, [string length])];

NSURL * url =  [NSURL URLWithString:[string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

【问题讨论】:

  • 为其他网址工作
  • 但不适用于上述网址
  • 我在 iOS 7 上测试这个
  • http%3A%2F%2F 更改为http://
  • 为什么你使用一个已经百分比转义的字符串,你又百分比转义了?使用正常的,如果需要,操作字符串(用“”替换“+”)然后转义它。

标签: ios objective-c nsurl nsstringencoding


【解决方案1】:

我的一位同事遇到了同样的问题,请尝试下面的代码行。希望您的问题能得到解决

NSMutableString *string = [[NSMutableString alloc]initWithString:
                           @"http%3A%2F%2Fsupport24hour.com%2Fworkplace2%2Fbuttler%2Fimage.php%3Fwidth%3D534%26height%3D256%26image%3Duploads%2Fdeals%2FdealImage%2Fdeal_1383005121_IGA+Logo.JPG"];

string = [[NSMutableString alloc] initWithString:[[string stringByURLDecode] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];

NSURL * url =  [NSURL URLWithString:string];

NSLog(@"url = %@",url);

其中 stringByURLDecode 是用于解码 URL 的类别方法,它是这样的

- (NSString *)stringByURLDecode {

NSMutableString *tempStr = [NSMutableString stringWithString:self];
[tempStr replaceOccurrencesOfString:@"+" withString:@" " options:NSCaseInsensitiveSearch range:NSMakeRange(0, [tempStr length])];

return [[NSString stringWithFormat:@"%@",tempStr] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

}

祝你好运(y)

【讨论】:

  • 不幸的是,这不会返回正确编码的 URL:它是:'http://support24hour.com/workplace2/buttler/image.php?width=534&height=256&image=uploads/deals/dealImage/deal_1383005121_IGA%20Logo.JPG',但应该是:'http://support24hour.com/workplace2/buttler/image.php?width=534&height=256&image=uploads/deals/dealImage/deal_1383005121_IGA+Logo.JPG'。请注意“+”替换 url 编码参数字符串中的空格,如w3c spec 中定义的算法中所定义。
【解决方案2】:

您不能对 整个 字符串进行百分比编码。相反,只有组件中的 data octet 可能必须被编码。

换句话说,URI 由由某些字符分隔的组件和子组件组成。这些字符称为“保留字符”。不同组件的分隔符肯定不能包含在百分比编码中。

请注意,URL 的每个组成部分可能需要稍微不同的百分比编码。

另见RFC 3986


编辑:

URL 的一般结构如下所示:

  URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

以下两个示例直接从 RFC 复制而来,显示了它们的组成部分:

     foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment
      |   _____________________|__
     / \ /                        \
     urn:example:animal:ferret:nose

“查询组件”由“键/值”参数列表组成,其键和值由“=”分隔,其参数由“&”分隔。

查询组件是问号'?' 之后的所有内容,直到哈希字符'#'

以下代码编码参数的名称。注意参数必须用“&”分隔,名称和值必须用“=”分隔。

static NSString* form_urlencode_rfc3986(NSString* s) {
    CFStringRef charactersToLeaveUnescaped = CFSTR(" ");
    //CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~");
    // Modified for urls (excluding '~'):
    CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@");

    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
                             kCFAllocatorDefault,
                             (__bridge CFStringRef)s,
                             charactersToLeaveUnescaped,
                             legalURLCharactersToBeEscaped,
                             kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}

【讨论】:

  • 是的。它应该像@"http://support24hour.com/workplace ...。查询组件可以编码,稍后将在编辑中显示,请稍等。
  • 如果我将 5121_IGA+Logo.JPG 更改为 5121_IGALogo.JPG
  • 我刚刚删除了上面的“+”字符
  • 注意:除非“路径”和“权限”组件包含不寻常的字符,这些字符是保留字符(非常、非常、不太可能),那么您只有 需要对查询组件的 valuekey 进行百分比编码。曾经,您分别对它们进行编码,用@“%@=%@”之类的格式字符串组成一个“参数字符串”。然后将参数组合到“查询字符串”中,用“&”分隔它们。然后。最后将这个(编码的)查询字符串添加到 url。
  • 我正在用你的答案试验我的东西......会尽快让你知道......谢谢
【解决方案3】:

嗯...在将字符串转换为 NSURL 之前打印出字符串怎么样?它看起来像你期望的那样吗?

另外:用空格替换“+”或者你真的想删除它吗?

【讨论】:

  • 打印与预期相同
  • 第二行用于解码
  • 好的,但不会“用 [Space] 替换 +”... deal_1383005121_IGA[Space]Logo.JPG out of deal_1383005121_IGA+Logo.JPG 吗?
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2018-09-03
  • 2015-02-24
  • 2016-07-28
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多