Ответ 1
Амперсанды не будут обрабатываться этим методом, поскольку они являются юридическими символами в URL-адресе. Вы должны, вероятно, предварительно обработать особенно проблемные фрагменты, по частям, до этого вызова.
Какой метод кодирования NSString будет уклоняться от символа амперсанда (&) в %26
?
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding
получает пробелы ( %20) и другие злоумышленники, но игнорирует амперсанды!?!
Амперсанды не будут обрабатываться этим методом, поскольку они являются юридическими символами в URL-адресе. Вы должны, вероятно, предварительно обработать особенно проблемные фрагменты, по частям, до этого вызова.
Вот хорошее решение этой проблемы, взятое из блог Bagonca, чтобы URL-кодировать ваши NSStrings:
+ (NSString *)urlEncodeValue:(NSString *)str
{
NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}
Добавить CFBridgingRelease(
для совместимости с ARC.
+ (NSString *)urlEncodeValue:(NSString *)str
{
NSString *result = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8));
return result;
}
Принятый ответ не совсем прав, я не думаю, вам нужно обработать строку после, вызвав addPercentEscapesAndReplaceAmpersand
+ (NSString *) addPercentEscapesAndReplaceAmpersand: (NSString *) stringToEncode
{
NSString *encodedString = [stringToEncode stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
return [encodedString stringByReplacingOccurrencesOfString: @"&" withString: @"%26"];
}