уничарное сравнение в объективе c - PullRequest
3 голосов
/ 14 февраля 2012

Мне нужно реализовать метод, который сравнивает две строки на равенство, считая некоторые турецкие буквы латинскими (например, ı = i).Это узкое место в программе, поэтому его необходимо реализовать максимально эффективно.

Я не могу использовать NSString сравнить: сOption: nsdiactricinsensitivesearch, потому что он не работает с турецкими буквами правильно.

Вот реализация моего алгоритма:

- (NSComparisonResult) compareTurkishSymbol:(unichar)ch with:(unichar)another
{
    //needs to be implemented
    //code like: if (ch == 'ı') doesn't work correctly
}

- (NSComparisonResult)compareTurkish:(NSString*)word with:(NSString*)another
{
    NSUInteger i;
    for (i =0; i < word.length; ++i) {
        NSComparisonResult result =[self compareTurkishSymbol:[word characterAtIndex:i] with:[another characterAtIndex:i]];
        if (result != NSOrderedSame) {
            return result;
        }
    }

    return another.length > word.length ? NSOrderedDescending : NSOrderedSame;
}

Проблема в том, что я не могу правильно сравнить unichars.Он не сравнивает правильно символы не ascii.Как с этим бороться?

1 Ответ

3 голосов
/ 16 февраля 2012

Наконец я нашел ответ.

unichar - беззнаковый short, это означает, что у каждого символа есть свой код. Поэтому мы можем сравнивать их не как символы, а как числа.

- (NSComparisonResult) compareTurkishSymbol:(unichar)ch with:(unichar)another
{
    if (ch == 305) {//code of 'ı'
      ch = 'i';  
    }
    return ch - another;
}
...