比较带有特殊字符的阿拉伯字符串 ios

Compare arabic strings with special characters ios

当比较两个具有特殊字符的阿拉伯字符串时 “zh” “zh” 比较总是失败

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

BOOL ifEqual ;

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

这两个字符串包含 "إ" 不同表示形式的字符: 第一个字符串作为一个字符("precomposed representation"):

U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW

和第二个字符串作为两个字符 ("decomposed representation")

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;
}

Swift 字符串比较自动处理:

let string1 = "الإجمالي"
let string2 = "الإجمالي"

print(string1 == string2)
// true

您遇到的问题是由于isEqualToString:执行文字比较,即组成两个字符串的字节序列必须完全相同.

您的两个字符串看起来相同但构造不同,一个使用单个 Unicode 代码点表示阿拉伯字母 ALEF WITH HAMZA BELOW,另一个使用两个代码点 ARABIC LETTER ALEF 和 ARABIC HAMZA BELOW 生成相同的字符 -这两种形式分别称为预合成和分解。

标准字符串 compare: 系列方法(compare:options:localizedCompare: )默认考虑组合字符,其中的形式通过指定 NSLiteralSearch.

可以将选项设置为表现得像 isEqualToString

所以只需将您的代码更改为:

ifEqual = [string1 compare:string2] == NSOrderedSame;

你会得到你期望的答案。