比较带有特殊字符的阿拉伯字符串 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;
你会得到你期望的答案。
当比较两个具有特殊字符的阿拉伯字符串时 “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;
你会得到你期望的答案。