2010-08-08 3 views
1

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

Однако при сравнении строк, подобных этому, кажется, что 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]]; 

Не возвращает NSOderedSame. Я записал эти первые символы в Консоль, и они кажутся одинаковыми. Я также рассмотрел различия в возвратах каретки и попытался заменить @ "\ r" на @ "" в обеих строках перед сравнением, что не работает (и, кроме того, это не должно влиять на равенство только первого символа). Я не хочу удалять символы @ "\ n", потому что я хочу сохранить несколько строк.

Что происходит? Любые другие идеи?

+3

Вы пытались захватить unichar буферы из каждой строки и повторять их параллельно, чтобы узнать, где они отличаются? –

+0

Вы также можете попробовать использовать один из методов '-precomposedStringWithCanonicalMapping' или' -precomposedStringWithCompatibilityMapping' и посмотреть, если это имеет значение. –

+1

Что делать, если вы пишете 'dataUsingEncoding каждой строки:' UTF-8 (или ASCII) в файл и различаете их, или шестнадцатеричный дамп их и разбрасываете шестнадцатеричные дампы? –

ответ

1

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

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

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

+0

Нет необходимости снова присоединяться к разрыву. Сравнивайте массивы напрямую, результаты будут одинаковыми. –

0

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

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] 
Смежные вопросы