无法从NSString创buildNSUrl总是得到零

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]]; 

我的同事面临同样的问题,尝试下面的代码行。 希望你的问题将得到解决

 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)

您不得百分比编码整个string。 相反,只有组件中的数据字节必须被编码。

换句话说,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:@"+"]; } 

嗯…在把它变成NSURL之前打印出string呢? 它看起来像你所期望的那样吗?

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