iPhone NSString сравнение с расширенным набором символов Unicode ASCII или Latin 1 - PullRequest
0 голосов
/ 17 октября 2011

У меня проблема с 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" сравнить с "aæ" возвращается по убыванию, почему? то же самое для "а" тоже.

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Найти здесь Подробнее о строковых операциях

Если кто-то споткнется с этим вопросом, я так и решил. Кажется, есть все еще некоторая проблема с неанглийскими символами в сравнении 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 голосов
/ 18 октября 2011

Следующим способом может быть решение, но оно работает для сравнения с å, но не для ø и æ.

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