比较特殊字符的阿拉伯语字符串IOS

比较特殊字符的阿拉伯语字符串IOS

问题描述:

当比较有特殊字符,如 两位阿拉伯数字串“إ”“أ” 比较总是失败比较特殊字符的阿拉伯语字符串IOS

NSString* string1 = @"الإجمالي"; 
NSString* string2 = @"الإجمالي"; 

BOOL ifEqual ; 

if([string1 isEqualToString:string2]){ 
    ifEqual = YES; 
}else{ 
    ifEqual = NO; //Answer is NO 
} 
+2

您是否尝试过在'NSString'中使用'localizedCompare:'方法' –

+0

您可能会考虑接受@ CRD的答案,而不是我的答案。 –

+0

谢谢你们,这是非常有用的@MartinR –

您所遇到的问题是由于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 
+0

我想你会发现Objective-C也会自动处理这个问题,看看我添加的答案。斯威夫特并不总是更好;-) – CRD

+0

@CRD:你说得对。我*认为*我尝试过,但显然我犯了一些错误。你的是正确的答案。 –