NSString isEqualToString: похоже, ошибочно сообщает о неравенстве - PullRequest
1 голос
/ 08 августа 2010

Я пытаюсь сравнить равенство двух многострочных строк. Я получаю одну из строк из веб-службы, а другую - из iTunes через мост сценариев. Строки из веб-службы в конечном итоге переносятся в iTunes, поэтому, если я сделаю это, а затем проведу повторное сравнение строк, в идеале они будут идентичны.

Однако при сравнении таких строк кажется, что isEqualToString: всегда возвращает неравенство. Я проверяю это, проверяя равенство строки из iTunes, которая исходила от веб-службы, и строки непосредственно из веб-службы.

Запись обеих строк в консоль приводит к выводу обеих строк, которые выглядят одинаково. Регистрация длин строк дает одинаковую длину.

Я также пытался сравнивать строки, используя некоторые другие методы. Например, я преобразовал их в строки 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 ]

1 голос
/ 11 августа 2010

Оказывается, эта проблема была связана с окончанием строки.Но так как я сравниваю многострочные строки, я не хотел полностью удалять новые строки.Я нормализовал окончания строк следующим образом:

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

Затем, сравнивая строки с помощью сравнения: работал как ожидалось.

0 голосов
/ 08 августа 2010

Просто угадайте здесь, но, возможно, используйте это, чтобы очистить ваши строки

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...