Метод NSString для процента escape '&' для URL

Какой метод кодирования NSString будет уклоняться от символа амперсанда (&) в %26?

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding

получает пробелы ( %20) и другие злоумышленники, но игнорирует амперсанды!?!

Ответ 1

Амперсанды не будут обрабатываться этим методом, поскольку они являются юридическими символами в URL-адресе. Вы должны, вероятно, предварительно обработать особенно проблемные фрагменты, по частям, до этого вызова.

Ответ 2

Вот хорошее решение этой проблемы, взятое из блог 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;
}

Ответ 3

Принятый ответ не совсем прав, я не думаю, вам нужно обработать строку после, вызвав addPercentEscapesAndReplaceAmpersand

+ (NSString *) addPercentEscapesAndReplaceAmpersand: (NSString *) stringToEncode
{
    NSString *encodedString = [stringToEncode stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
    return [encodedString stringByReplacingOccurrencesOfString: @"&" withString: @"%26"];
}