Escape-кавычки в Objective-C

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

   NSString *unescaped = [textField text];
   NSString *escapedString = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                                  NULL,
                                                                                  (__bridge_retained CFStringRef)unescaped,
                                                                                  NULL,
                                                                                  (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                  kCFStringEncodingUTF8);

который отлично работает, но не добавляет кавычки escape:"

Как избежать кавычек в IOS?

4 ответов


Я думаю, что я не правильно сформулировал вопрос.

мне нужно было взять введенную пользователем NSString из [textField text] и убедитесь, что если в строке есть кавычки, они экранируются должным образом, чтобы отправить оператор POST.

мое решение было:

unescaped = [unescaped stringByReplacingOccurrencesOfString:@"\"" withString:@"\\""];

спасибо


во-первых, вы не хотите использовать __bridge_retained в литой к CFStringRef. Просто используйте __bridge.

во-вторых, вам не нужно избегать кавычек вручную заменой строки. Просто добавьте символ цитаты в набор символов, которые будут цитироваться при вызове CFURLCreateStringByAddingPercentEscapes(). Вот так:

NSString *unescaped = [textField text];
NSString *escapedString = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                    (__bridge CFStringRef)unescaped,
                                                                                    NULL,
                                                                                    CFSTR("!*'();:@&=+$,/?%#[]\""),
                                                                                    kCFStringEncodingUTF8));

(в дополнение к добавлению цитаты в набор, я изменил использование CFBridgingRelease(), а не __bridge_transfer бросок, потому что я нахожу его более четким. Это удовлетворяет чувство, что все CF " создать" функции нуждаются в соответствующем "выпуске". Кроме того, я изменил использование @"" буквальный бросок в CFStringRef просто CFSTR("") литерал.)


кавычки должны быть экранированы с \".

в:

(CFStringRef)@"I'm an \"example\""

попробуйте использовать \" вместо использования " напрямую...

специальные символы, такие как кавычки, косые черты и другие, требуют \ сделать этот символ, чтобы удалить его специальную функциональность.