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

时间:2017-05-08 19:47:07

标签: ios objective-c arabic

比较两个有特殊字符的阿拉伯字符串  “إ”“أ” 比较总是失败

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

BOOL ifEqual ;

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

2 个答案:

答案 0 :(得分:2)

这两个字符串包含不同表示形式的"إ"字符: 第一个字符串作为一个字符(“预合成表示”):

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

Swift字符串比较自动处理:

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

print(string1 == string2)
// true

答案 1 :(得分:2)

您遇到的问题是private static final String[] filter = new String[] { "/p8/search", "/p8/continueQuery", "/p8/getStepAttachmentItems", "/p8/getDocumentVersions" }; @Override public String[] getFilteredServices() { return filter; } 执行文字比较,即构成两个字符串的字节序列必须完全相同。

你的两个字符串看起来相同但构造方式不同,一个使用单个Unicode代码点用于阿拉伯语字母ALEF和HAMZA BELOW,另一个使用两个代码点ARABIC LETTER ALEF和ARABIC HAMZA BELOW来产生相同的字符 - 这两个表格分别称为预分解和分解。

标准字符串isEqualToString:系列方法(compare:compare:options: )默认考虑组合字符,采取选项的形式可以是通过指定localizedCompare:设置为isEqualToString

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

NSLiteralSearch

你会得到你期望的答案。