Убежать от нужных вам персонажей - немного больше работы.
Пример кода
iOS7 и выше:
NSString *unescaped = @"http://www";
NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
NSLog(@"escapedString: %@", escapedString);
Вывод NSLog:
escapedString: http% 3A% 2F% 2Fwww
Ниже приведены полезные наборы символов кодирования URL:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
Создание набора символов, объединяющего все вышеперечисленное:
NSCharacterSet *URLCombinedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"#%/:<>?@[\\]^`{|}"] invertedSet];
Создание Base64
В случае набора символов Base64:
NSCharacterSet *URLBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"/+=\n"] invertedSet];
Для Swift 3.0:
var escapedString = originalString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
Для Swift 2.x:
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
Примечание: stringByAddingPercentEncodingWithAllowedCharacters
также будет кодировать символы UTF-8, требующие кодирования.
Предварительно iOS7 использует Core Foundation
Использование Core Foundation с ARC:
NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef) unescaped,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]\" "),
kCFStringEncodingUTF8));
Использование базовой основы без ARC:
NSString *escapedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)unescaped,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]\" "),
kCFStringEncodingUTF8);
Примечание: -stringByAddingPercentEscapesUsingEncoding
не даст правильную кодировку, в этом случае он не будет кодировать что-либо, возвращающее ту же строку.
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
кодирует 14 символов:
`#% ^ {} [] | \" <> плюс символ пробела в процентах.
testString:
" `~!@#$%^&*()_+-={}[]|\\:;\"'<,>.?/AZaz"
encodedString:
"%20%60~!@%23$%25%5E&*()_+-=%7B%7D%5B%5D%7C%5C:;%22'%3C,%3E.?/AZaz"
Примечание: подумайте, соответствует ли этот набор символов вашим потребностям, если не измените их при необходимости.
RFC 3986 символов, требующих кодирования (добавлено%, поскольку это префикс кодировки):
"# $ & '() * +, /:;!? = @ []%"
Некоторые "незарезервированные символы" дополнительно кодируются:
"\ n \ r \"% -. <> \ ^ _ `{|} ~"