9

我有一个调用网络服务的 Cocoa 应用程序。当我解析来自 Web 服务的响应时,我得到一个 \n 作为 XML 中每个元素的 NSXMLParser 的 foundCharacters 委托中的最后一个字符。

当我尝试执行以下操作时:

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

检查将始终无法捕获换行符。有人知道字符串检查换行符的好方法吗?

我也觉得奇怪的是,每个元素在每个值的末尾都有一个换行符,尽管我在 Web 服务的输出中没有看到任何证据。

对于应该非常容易做到的事情来说,这是一个相当大的问题。

4

3 回答 3

20

我认为这正是您所需要的?
text = [文本 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

于 2009-10-03T15:42:47.720 回答
12

当我解析来自网络服务的响应时,我得到一个 \n 作为最后一个字符......</p>

当我尝试执行以下操作时:

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

检查将始终无法捕获换行符。

YES该消息仅在string一个字符长且该字符为时才会返回\n

如果要测试字符串是否以结尾 \n,则需要使用hasSuffix:

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

如果您想从字符串的末尾剥离 \n并使用剩余的内容,则 phunehehe 的解决方案是正确的。

编辑:在 Jeremy W. Sherman 的回答中,他指出 Web 服务可能会为您提供以 CRLF 结尾的文本。这是一个有效的点,您不仅应该\n在行尾寻找,还应该检查完整的\r\n序列。他提供的代码是做到这一点的一种方法。不管你怎么做,你仍然需要删除整行分隔符,即使它是一个\r\n序列。

于 2009-10-03T20:45:29.607 回答
4

Web 服务可能会以 终止所有行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]]删除任何行尾空格或换行符。

于 2009-10-04T02:02:24.677 回答