2011-10-17 8 views
0

NSStringと比較して問題があります。 localizedCaseInsensitiveCompare:またはNSStringの他のcompare:メソッドは、拡張アスキー文字セットで私に間違った結果を返しています。例えばコードの下に、比較の後、noStringenString1の後になければなりません。iPhone拡張ASCIIまたはLatin 1 Unicode文字セットを持つNSStringの比較

私はどのように問題を解決できますか?

NSString * noString = @"ÅåÆæØøab"; // ASCII values, 197, 229, 198, 230, 216, 248, 97, 98 

    NSString * enString1 = @"fbcd"; 
    NSString * enString2 = @"bbcd"; 
    NSString * enString3 = @"zbcd"; 

    NSLog(@"%i", [enString1 localizedCaseInsensitiveCompare:enString2]); // 1 
    NSLog(@"%i", [enString1 localizedStandardCompare:noString]); // 1, should be -1 
    NSLog(@"%i", [enString1 localizedCaseInsensitiveCompare:noString]); // 1, should be -1 

"aa" compareTo "aå"は昇順に戻ります。そのとおり。しかし、

"aa" compareTo "aæ"は戻ってきます降順、なぜですか? 「あお」も同じです。

答えて

0

ここMore on string operations

を探す誰もがこの質問に応じstubmle場合は、これは私が解決策を作った方法です。 NSString比較で英語以外の文字に問題があるようです。特に、Å、Ø、Æなどの場合、ソート順はAa ...ÆØのように見えます。 ASCIIコードは違っています。だから自分の比較方法を書きました

- (NSComparisonResult) caseInsensitiveStringCompare:(NSString *)string1 
             anotherString:(NSString *)string2 
{ 
    NSString * ciString1 = [string1 lowercaseString]; 
    NSString * ciString2 = [string2 lowercaseString]; 
    return [self stringCompare:ciString1 anotherString:ciString2]; 
} 

- (NSComparisonResult) stringCompare:(NSString *)string1 
          anotherString:(NSString *)string2 
{ 
    int len1 = [string1 length]; 
    int len2 = [string2 length]; 

    if (len1 < len2) { 
     int i = 0; 

     while (i < len1 && [string1 characterAtIndex:i] == [string2 characterAtIndex:i] ) 
     { 
      i++; 
     } 
     if (i == len1) { 
      return NSOrderedAscending; 
     } else if ([string1 characterAtIndex:i] < [string2 characterAtIndex:i]) { 
      return NSOrderedAscending; 
     } else { 
      return NSOrderedDescending; 
     } 

    } else { // str1 >= str2 len 
     int i = 0; 

     while (i<len2 && [string1 characterAtIndex:i] == [string2 characterAtIndex:i]) 
     { 
      i++; 
     } 
     if (i == len2 && i == len1) { 
      return NSOrderedSame; 
     } else if (i == len2){ 
      return NSOrderedDescending; 
     } else if ([string1 characterAtIndex:i] < [string2 characterAtIndex:i]) { 
      return NSOrderedAscending; 
     } else { 
      return NSOrderedDescending; 
     } 
    } 

    return NSOrderedSame; 
} 
0

解決方法は次のとおりですが、åと比較するには効果がありますが、øやæは効果がありません。

NSLog(@"%i", [enString1 compare:noString options:NSCaseInsensitiveSearch 
           range:NSMakeRange(0, [enString1 length]) 
          locale:[[NSLocale alloc] initWithLocaleIdentifier:@"no"] ]); 
関連する問題