NSString isEqualToString: для \ n - PullRequest
       25

NSString isEqualToString: для \ n

9 голосов
/ 03 октября 2009

У меня есть приложение Какао, которое вызывает веб-сервис. Когда я анализирую ответ веб-службы, я получаю \ n как последний символ в моем делегате foundCharacters для NSXMLParser для каждого элемента в XML.

Когда я пытаюсь сделать следующее:

if (![string isEqualToString:@"\n"])

Проверка всегда не сможет перехватить новую строку. Кто-нибудь знает хороший способ проверки строки?

Мне также странно, что каждый элемент будет иметь новую строку в конце каждого значения, хотя я не вижу доказательств этого в выходных данных веб-службы.

Это довольно серьезная проблема для чего-то, что должно быть исключительно легко сделать.

Ответы [ 3 ]

20 голосов
/ 03 октября 2009

Я думаю, это как раз то, что вам нужно?
text = [text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

12 голосов
/ 04 октября 2009

Когда я анализирую ответ от веб-службы, я получаю \ n в качестве последнего символа ...

Когда я пытаюсь сделать следующее:

if (![string isEqualToString:@"\n"])

Проверка всегда не сможет перехватить новую строку.

Это сообщение вернет YES, только если string имеет длину один символ и этот символ \n.

Если вы хотите проверить, заканчивается ли строка на \n, вам нужно использовать hasSuffix::

if (![string hasSuffix:@"\n"])

Если вы хотите снять \n с конца строки и использовать то, что осталось, решение phunehehe является правильным.

Редактировать: В ответе Джереми У. Шермана он указывает, что веб-служба может выдавать вам CRLF-завершенный текст. Это правильная точка, и вы должны не только искать \n в конце строки, но и проверять полную последовательность \r\n. Код, который он представляет, является одним из способов сделать это. Как бы вы это ни делали, вам все равно нужно удалить разделитель строк, даже если это последовательность \r\n.

4 голосов
/ 04 октября 2009

Веб-служба, вероятно, завершает все строки с CRLF, т.е. "\r\n". Вы находитесь в системе UNIX, поэтому символ перевода строки '\n' берется в качестве разделителя строк; возврат каретки '\r' оставлен как часть предыдущей строки. При печати он будет иметь тот же эффект, что и '\n'. Вы убедились (используя, скажем, strvis), что конечный символ строки равен '\n', а не '\r'?

-[NSString hasSuffix:] будет перехватывать только указанный вами символ новой строки. Чтобы проверить, заканчивается ли строка новой строкой или пробелом, вот метод предполагаемой категории:

- (BOOL)my_hasWhitespaceOrNewlineSuffix {
  NSRange r = [self rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]
                                    options:NSBackwardsSearch];
  BOOL foundChar = r.location != NSNotFound;
  BOOL isLineFinal = foundChar && (r.location + r.length == [self length]);
  return isLineFinal;
}

Вы можете использовать предложение phunehehe о text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]], чтобы удалить любые пробелы или новые строки в конце строки.

...