StringByAddingPercentEscapes не работает с амперсандами, вопросительными знаками и т. Д. - PullRequest
1 голос
/ 16 августа 2011

Я отправляю запрос из моего iphone-приложения, где некоторые аргументы представляют собой текст, который пользователь может ввести в текстовые поля. Поэтому мне нужно их HTML-кодировать.

Вот проблема, с которой я сталкиваюсь:

NSLog(@"%@", testText); // Test & ?
testText = [testText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", testText); // Test%20&%20?

Как видите, кодируются только пробелы, поэтому сервер игнорирует все, что находится за амперсандом, для аргумента.

Является ли это объявленным поведением stringByAddingPercentEscapes? Нужно ли вручную заменять каждый специальный символ соответствующим шестнадцатеричным кодом?

Благодарен за любой вклад.

1 Ответ

1 голос
/ 16 августа 2011

Они не закодированы, потому что они являются действительными символами URL.
Документация для stringByAddingPercentEscapesUsingEncoding: говорит

См. CFURLCreateStringByAddingPercentEscapes для более сложных преобразований.

Iзакодировать параметры строки моего запроса, используя следующий метод (добавленный в категорию NSString)

- (NSString *)urlEncodedString {
    CFStringRef buffer = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                 (CFStringRef)self,
                                                                 NULL,
                                                                 CFSTR("!*'();:@&=+$,/?%#[]"),
                                                                 kCFStringEncodingUTF8);
    NSString *result = [NSString stringWithString:(NSString *)buffer];
    CFRelease(buffer);

    return result;
}
...