NSString的isEqualToString:似乎错误地报告了不相等

时间:2010-08-08 03:01:02

标签: cocoa nsstring

我正在尝试比较两个多行字符串的相等性。我从Web服务中获取其中一个字符串,另一个是通过Scripting Bridge从iTunes获取的。来自Web服务的字符串最终会传输到iTunes,所以如果我这样做,然后重新比较字符串,理想情况下它们是相同的。

但是,在比较这样的字符串时,似乎isEqualToString:始终返回不相等。我通过测试最初来自Web服务的iTunes中的字符串的相等性以及直接来自Web服务的字符串来测试它。

将两个字符串记录到控制台会从两个看起来相同的字符串生成输出。记录字符串的长度会产生相同的长度。

我也尝试过使用其他方法比较字符串。例如,我将它们转换为ASCII字符串,以确保它不是一些Unicode问题:

        NSData *iTunesStringData = [[self iTunesString] dataUsingEncoding:NSASCIIStringEncoding
                                                     allowLossyConversion:YES];
        NSData *webServiceStringData = [[self webServiceString] dataUsingEncoding:NSASCIIStringEncoding
                                                     allowLossyConversion:YES];


        NSString *newiTunesString = [[[NSString alloc] initWithData:iTunesStringData encoding:NSASCIIStringEncoding] autorelease];
        NSString *newWebServiceString = [[[NSString alloc] initWithData:webServiceStringData encoding:NSASCIIStringEncoding] autorelease];

        BOOL result = [newiTunesString isEqualToString:newWebServiceString];

同样的问题,不相等。我试过比较第一个字符:

        NSComparisonResult result = [newiTunesString compare:newWebServiceString
                                                            options:NSLiteralSearch
                                                              range:NSMakeRange(0,1)
                                                             locale:[NSLocale currentLocale]];

不返回NSOrderedSame。我已将这些第一个字符记录到控制台,它们看起来完全相同。我还考虑了回车的差异,并尝试在比较之前在两个字符串中用@“”替换@“\ r”,这不起作用(此外,这不应该只影响第一个字符的相等性)。我不想删除@“\ n”字符,因为我想保留多行。

发生了什么事?还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

事实证明这个问题 与行结尾有关。但是因为我正在比较多行字符串,所以我不想完全删除换行符。我将行结尾标准化为:

        NSString *normalizediTunesString = [[[self iTunesString] componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@"\n"];
        NSString *normalizedWebServiceString = [[[self webServiceString] componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@"\n"];

然后,通过比较比较字符串:按预期工作。

答案 1 :(得分:0)

只是在这里猜测,但也许可以用它来清理你的字符串

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]