在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; }