2011-10-17 48 views
0

我有问题NSString比较。 localizedCaseInsensitiveCompare或任何其他compareNSString中的方法将错误的结果返回给我,并带有扩展ascii字符集。例如下面的代码,经过比较,noString应该在enString1之后。iPhone NSString比较具有扩展ASCII或拉丁语1 Unicode字符集

任何想法,我该如何解决问题?

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比较中似乎还存在一些非英文字符的问题。特别适用于Å,Ø和Æ等。即使进行了局部比较,排序顺序似乎也是AÅ...ÆØ。尽管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"] ]);