當比較有特殊字符,如 兩位阿拉伯數字串「إ」「أ」 比較總是失敗比較特殊字符的阿拉伯語字符串IOS
NSString* string1 = @"الإجمالي";
NSString* string2 = @"الإجمالي";
BOOL ifEqual ;
if([string1 isEqualToString:string2]){
ifEqual = YES;
}else{
ifEqual = NO; //Answer is NO
}
當比較有特殊字符,如 兩位阿拉伯數字串「إ」「أ」 比較總是失敗比較特殊字符的阿拉伯語字符串IOS
NSString* string1 = @"الإجمالي";
NSString* string2 = @"الإجمالي";
BOOL ifEqual ;
if([string1 isEqualToString:string2]){
ifEqual = YES;
}else{
ifEqual = NO; //Answer is NO
}
您所遇到的問題是由於isEqualToString:
執行文字比較,那就是序列o組成這兩個字符串的f字節必須完全相同。
您的兩個字符串看起來相同,但構造不同,其中一個使用單一Unicode碼位作爲阿拉伯字母ALEF與HAMZA BELOW,另一個使用兩個碼位阿拉伯字母ALEF和阿拉伯哈姆薩以下產生相同字符 - 這些兩種形式分別稱爲預分解和分解。
標準字符串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
我想你會發現Objective-C也會自動處理這個問題,看看我添加的答案。斯威夫特並不總是更好;-) – CRD
@CRD:你說得對。我*認爲*我嘗試過,但顯然我犯了一些錯誤。你的是正確的答案。 –
您是否嘗試過在'NSString'中使用'localizedCompare:'方法' –
您可能會考慮接受@ CRD的答案,而不是我的答案。 –
謝謝你們,這是非常有用的@MartinR –