【问题标题】:NSString isEqualToString: for \nNSString isEqualToString: for \n
【发布时间】:2009-10-03 15:38:15
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我假设上面的代码是“isEqualToString:”而不是“isStringEqualTo:”?
  • 是的,谢谢,我已经在问题中更改了。

标签: objective-c cocoa nsstring string-comparison


【解决方案1】:

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

【讨论】:

  • 工作就像一个魅力。只是出于好奇,有人知道为什么必须这样做吗?在几乎所有其他语言中,您不需要执行此步骤,您可以简单地在换行符上进行字符串比较,或者它是 UNIX 如何解释换行回车的问题,就像 jayw 提到的那样?
  • 斯科特·兰斯:阅读我的回答。它解释了为什么他的isEqualToString: 消息没有按预期工作。
【解决方案2】:

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

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

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

检查总是无法捕捉到换行符。

如果string 是一个字符且该字符是\n,则该消息只会返回YES

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

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

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

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

【讨论】:

    【解决方案3】:

    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]] 建议删除任何行尾空格或换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多