当比较两个具有特殊字符的阿拉伯语字符串时,例如 "إ " "أ"比较总是失败
NSString* string1 = @"الإجمالي";
NSString* string2 = @"الإجمالي";
BOOL ifEqual ;
if([string1 isEqualToString:string2]){
ifEqual = YES;
}else{
ifEqual = NO; //Answer is NO
}
您遇到的问题是由于isEqualToString:
执行文字比较,即构成两个字符串的字节序列必须完全相同。
您的两个字符串看起来相同,但构造不同,一个使用阿拉伯语字母 ALEF 的单个 Unicode 代码点,下面有 HAMZA,另一个使用两个代码点 ARABIC LETTER ALEF 和 ARABIC HAMZA 来生成相同的字符 - 这两种形式分别称为预组合和分解。
标准字符串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