2010-08-08 39 views
1

我試圖比較兩個多行字符串的相等性。我從Web服務中獲得一個字符串,另一個是通過Scripting Bridge從iTunes獲取的字符串。來自Web服務的字符串最終會傳輸到iTunes,所以如果我這樣做,然後重新比較字符串,理想情況下它們是相同的。NSString的isEqualToString:似乎錯誤地報告不等於

但是,當比較這樣的字符串時,似乎isEqualToString:總是返回不等式。我通過測試來自iTunes的一個字符串來源於Web服務,並直接從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」字符,因爲我想保留多行。

發生了什麼事?任何其他想法?

+3

您是否試過從每個字符串中獲取unichar緩衝區,並且在並行迭代它們以找出它們的不同之處? – 2010-08-08 03:03:28

+0

你也可以嘗試使用'-precomposedStringWithCanonicalMapping'或'-precomposedStringWithCompatibilityMapping'方法之一,看看是否有所作爲。 – 2010-08-08 03:05:15

+1

如果將每個字符串的'dataUsingEncoding:'UTF-8(或ASCII)寫入文件並對它們進行比較或十六進制轉儲它們並對十六進制轉儲進行比較呢? – 2010-08-08 03:09:09

回答

1

事實證明,這個問題相關線路的結局。但是因爲我在比較多行字符串,所以我不想完全去掉換行符。我正常化了這樣的行尾:

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

然後,通過compare比較字符串:按預期工作。

+0

沒有必要再次加入拆分。直接比較數組,結果將是相同的。 – 2012-04-16 13:46:55

0

只是猜測這裏,但也許用這個清理你的字符串

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] 
相關問題