【问题标题】:iPhone NSString comparison having Extended ASCII or Latin 1 Unicode character set具有扩展 ASCII 或拉丁 1 Unicode 字符集的 iPhone NSString 比较
【发布时间】:2011-10-17 19:58:30
【问题描述】:

我在比较 NSString 时遇到问题。 localizedCaseInsensitiveCompare: 或 compare: 中的任何其他 NSString 方法使用扩展的 ascii 字符集向我返回错误的结果。例如下面的代码,经过比较,noString 应该在enString1 之后。

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

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æ" 返回降序,为什么? “aø”也一样。

【问题讨论】:

    标签: iphone unicode nsstring compare latin1


    【解决方案1】:

    以下方法可以解决,但它适用于与å比较,但不适用于ø和æ。

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

    【讨论】:

      【解决方案2】:

      在这里找到More on string operations

      如果有人在这个问题上遇到困难,这就是我提出解决方案的方式。 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-09
        • 2012-11-18
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 2013-10-21
        • 2014-06-06
        • 1970-01-01
        • 2012-09-18
        相关资源
        最近更新 更多