比较特殊字符的阿拉伯语字符串IOS
当比较有特殊字符,如 两位阿拉伯数字串“إ”“أ” 比较总是失败比较特殊字符的阿拉伯语字符串IOS
NSString* string1 = @"الإجمالي";
NSString* string2 = @"الإجمالي";
BOOL ifEqual ;
if([string1 isEqualToString:string2]){
ifEqual = YES;
}else{
ifEqual = NO; //Answer is NO
}
您所遇到的问题是由于isEqualToString:
执行文字比较,那就是序列o组成这两个字符串的f字节必须完全相同。
您的两个字符串看起来相同,但构造不同,其中一个使用单一Unicode码位作为阿拉伯字母ALEF与HAMZA BELOW,另一个使用两个码位阿拉伯字母ALEF和阿拉伯哈姆萨以下产生相同字符 - 这些两种形式分别称为预分解和分解。
标准字符串compare:
家族的方法(compare:options:
,localizedCompare:
等)默认为考虑由字符,这取一个选项的形式可以被设置通过指定NSLiteralSearch
表现得像isEqualToString
。
所以只要改变你的代码:
ifEqual = [string1 compare:string2] == NSOrderedSame;
,你会得到你所期望的答案。
两个字符串包含不同的代表性"إ"
字符: 第一个字符串为一个字符(“预组合表示”):
U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW
和所述第二串为两个字符(“分解表示”)
U+0627 ARABIC LETTER ALEF
U+0655 ARABIC HAMZA BELOW
如果转换两个字符串的预组合表示,则 他们的比较结果相等:
NSString* string1 = @"الإجمالي";
NSString* string2 = @"الإجمالي";
string1 = string1.precomposedStringWithCanonicalMapping;
string2 = string2.precomposedStringWithCanonicalMapping;
BOOL ifEqual ;
if ([string1 isEqualToString:string2]) {
ifEqual = YES; //Answer is YES
} else {
ifEqual = NO;
}
斯威夫特字符串比较处理,可自动:
let string1 = "الإجمالي"
let string2 = "الإجمالي"
print(string1 == string2)
// true
我想你会发现Objective-C也会自动处理这个问题,看看我添加的答案。斯威夫特并不总是更好;-) – CRD
@CRD:你说得对。我*认为*我尝试过,但显然我犯了一些错误。你的是正确的答案。 –
您是否尝试过在'NSString'中使用'localizedCompare:'方法' –
您可能会考虑接受@ CRD的答案,而不是我的答案。 –
谢谢你们,这是非常有用的@MartinR –