NSString isEqualToString:for \ n

时间:2009-10-03 15:38:15

标签: objective-c cocoa nsstring string-comparison

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

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

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

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

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

对于一些特别容易做的事情来说,这是一个非常棘手的问题。

3 个答案:

答案 0 :(得分:20)

我认为这正是你需要的?     text = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

答案 1 :(得分:12)

  

当我解析来自Web服务的响应时,我得到一个\ n作为最后一个字符...

     

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

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

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

如果YES长度为一个且该字符为string,则该邮件只会返回\n

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

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

如果你想从字符串的末尾剥离 \n并使用剩下的东西,那么phunehehe的解决方案是正确的。

编辑:在Jeremy W. Sherman的回答中,他指出网络服务可能会为您提供CRLF终止的文本。这是一个有效点,您不仅应该在该行的末尾查找\n,还要检查完整的\r\n序列。他提供的代码是一种方法。无论如何,您仍然需要删除整行分隔符,即使它是\r\n序列。

答案 2 :(得分:4)

网络服务可能会终止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]]建议删除任何行终点空格或换行符。