比较阿拉伯字符串与特殊字符 ios



当比较两个具有特殊字符的阿拉伯语字符串时,例如 "إ " "أ"比较总是失败

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

最新更新