Сравнение iPhone NSString с расширенным набором символов ASCII или Latin 1 Unicode
У меня проблемы с 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 ответа
Найти здесь Подробнее о строковых операциях
Если кто-то спорит с этим вопросом, я так и решил. Кажется, есть все еще некоторая проблема с неанглийскими символами в сравнении 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;
}
Следующий способ может быть решением, но он работает для сравнения с å, но не для ø и æ.
NSLog(@"%i", [enString1 compare:noString options:NSCaseInsensitiveSearch
range:NSMakeRange(0, [enString1 length])
locale:[[NSLocale alloc] initWithLocaleIdentifier:@"no"] ]);