在iOS 9中不推荐使用CFURLCreateStringByAddingPercentEscapes,如何使用“stringByAddingPercentEncodingWithAllowedCharacters”

我有以下代码:

return (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR(";:@&=+$,/?%#[]"), kCFStringEncodingUTF8); 

Xcode说它已经在iOS 9中被弃用了。那么,我该如何使用stringByAddingPercentEncodingWithAllowedCharacters?

谢谢!

尝试这个

 NSString *value = @"<url>"; value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; 

字符集URLQueryAllowedCharacterSet包含URL查询部分( ..?key1=value1&key2=value2 )中允许的所有字符,并不限于此类查询的键和值中允许使用的字符。 例如, URLQueryAllowedCharacterSet包含&+ ,因为这些查询当然是允许的( &分隔键/值对, +表示空格),但是它们不允许在这样的查询的中。

考虑这个代码:

 NSString * key = "my&name"; NSString * value = "test+test"; NSString * safeKey= [key stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet] ]; NSString * safeValue= [value stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet] ]; NSString * query = [NSString stringWithFormat:@"?%@=%@", safeKey, safeValue]; 

query将是?my&name=test+test ,这是完全错误的。 它定义了一个名为my的键,它没有值,一个名为name的键的值是test test (+表示空格!)。

正确的查询应该是?my%26name=test%2Btest

只要你只处理ASCIIstring,或者只要服务器可以处理URL中的UTF-8字符(现在大多数Web服务器都这样做),那么你绝对必须编码的字符数量实际上是相当小而且很稳定。 试试这个代码:

 NSCharacterSet * queryKVSet = [NSCharacterSet characterSetWithCharactersInString:":/?&=;+!@#$()',*" ].invertedSet; NSString * value = ...; NSString * valueSafe = [value stringByAddingPercentEncodingWithAllowedCharacters:queryKVSet ]; 

URLQueryAllowedCharacterSet允许对字符进行编码的另一种解决scheme,但不允许在键或值中使用(例如: + ):

 - (NSString *)encodeByAddingPercentEscapes { NSMutableCharacterSet *charset = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; [charset removeCharactersInString:@"!*'();:@&=+$,/?%#[]"]; NSString *encodedValue = [self stringByAddingPercentEncodingWithAllowedCharacters:charset]; return encodedValue; }