我有一个调用Web服务的Cocoa应用程序。当我解析来自Web服务的响应时,我得到一个\ n作为XML的每个元素的NSXMLParser的foundCharacters委托中的最后一个字符。
当我尝试执行以下操作时:
if (![string isEqualToString:@"\n"])
检查将始终无法捕获换行符。有人知道串联检查换行符的好方法吗?
我也觉得很奇怪,每个元素在每个值的末尾都会有一个换行符,即使我在Web服务的输出中没有看到任何证据。
对于一些特别容易做的事情来说,这是一个非常棘手的问题。
答案 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]]
建议删除任何行终点空格或换行符。