比较两个有特殊字符的阿拉伯字符串 “إ”“أ” 比较总是失败
NSString* string1 = @"الإجمالي";
NSString* string2 = @"الإجمالي";
BOOL ifEqual ;
if([string1 isEqualToString:string2]){
ifEqual = YES;
}else{
ifEqual = NO; //Answer is NO
}
答案 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
你会得到你期望的答案。