Экранирование обратной косой черты NSString

Я работаю над приложением для iPhone OS, которое отправляет xml-запрос в веб-службу. Чтобы отправить запрос, XML добавляется в NSString. При этом у меня возникли проблемы с кавычками " и обратной косой чертой \ в файле xml, которые требовали экранирования. Есть ли полный список символов, которые нужно экранировать?

Кроме того, существует ли общепринятый способ экранирования (т. е. замена \ на \\ и " на \") или это случай создания метода самостоятельно?

Спасибо


person Jack    schedule 28.05.2010    source источник
comment
Не понятно в чем проблема. Почему вы должны экранировать символы?   -  person Nikolai Ruhe    schedule 20.03.2013
comment
Привет Николай, это было почти три года назад. Мне нужно было экранировать символы, чтобы сформировать действительный xml. Спасибо   -  person Jack    schedule 22.03.2013


Ответы (2)


NSString *escapedString = [unescapedString stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
escapedString = [escapedString stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];

Не полностью отвечает на ваш вопрос, но, похоже, это может помочь со второй частью...

person Jonny Cook    schedule 09.07.2010

Вы можете использовать NSScanner, который будет сканировать символы из набора символов и, если он будет найден, добавит экранирующий \\ в новую строку и скопирует следующую подстроку из найденного специального символа в следующую.

NSString *sourceString = /* Some input String*/;
NSMutableString *destString = [@"" mutableCopy];
NSCharacterSet *escapeCharsSet = [NSCharacterSet characterSetWithCharactersInString:@" ()\\"];

NSScanner *scanner = [NSScanner scannerWithString:sourceString];
while (![scanner isAtEnd]) {
    NSString *tempString;
    [scanner scanUpToCharactersFromSet:escapeCharsSet intoString:&tempString];
    if([scanner isAtEnd]){
        [destString appendString:tempString];
    }
    else {
        [destString appendFormat:@"%@\\%@", tempString, [sourceString substringWithRange:NSMakeRange([scanner scanLocation], 1)]];
        [scanner setScanLocation:[scanner scanLocation]+1];
    }
}
person vikingosegundo    schedule 19.03.2013