2014-11-17 8 views
1

Я пытаюсь сделать нечувствительное к регистру сравнение «i» и «I» на OSX Yosemite с использованием настроек голландского языка. Но OSX продолжает говорить мне, что строки разные. Если я изменю локаль на «en_US», сравнение будет работать, как ожидалось.Нечувствительное к регистру сравнение «i» и «I» не выполняется с настройками голландского языка в OSX Yosemite

Для демонстрации проблемы может использоваться следующий проект «инструмент командной строки» xcode.

#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 

     CFStringRef s1 = (__bridge CFStringRef)@"i"; 
     CFStringRef s2 = (__bridge CFStringRef)@"I"; 

     CFLocaleRef tmpLocale = CFLocaleCreate(nil, (__bridge CFStringRef)@"nl_NL"); // or // CFLocaleRef tmpLocale = CFLocaleCopyCurrent(); on a Dutch OSX 

     int result = CFStringCompareWithOptionsAndLocale(s1, s2, CFRangeMake(0, 1), kCFCompareCaseInsensitive, tmpLocale); 

     CFRelease(tmpLocale); 

     NSLog(@"%d", result); 

     if (result == 0) NSLog(@"same"); else NSLog(@"different"); 

    } 
    return 0; 
} 

Это ошибка в OSX или есть что-то, что мне не хватает?

+0

При инициализации 'CFStringRef' вы можете просто использовать макрос 'CFSTR (« i ») 'вместо того, чтобы навести 'NSString' до CoreFoundation. Но ваш путь не ошибается. Просто пища для размышлений! – Sean

ответ

1

Для сортировки (сопоставления) и преобразования орграфа «ij» голландский язык нуждается в специальной логике (становится «IJ» при заглавном или заглавном). Эти две буквы часто считаются единственной буквой (или лигатурой) для голландских словарей и их языка.

То, что вы испытываете, действительно пахнет, как законная ошибка в CoreFoundation. После дальнейшего тестирования любая строка, начинающаяся с «i», возвращает CFStringCompareWithOptionsAndLocale либо 1, либо -1, но не 0.