2017-05-08 140 views
0

當比較有特殊字符,如 兩位阿拉伯數字串「إ」「أ」 比較總是失敗比較特殊字符的阿拉伯語字符串IOS

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

BOOL ifEqual ; 

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

您是否嘗試過在'NSString'中使用'localizedCompare:'方法' –

+0

您可能會考慮接受@ CRD的答案,而不是我的答案。 –

+0

謝謝你們,這是非常有用的@MartinR –

回答

1

您所遇到的問題是由於isEqualToString:執行文字比較,那就是序列o組成這兩個字符串的f字節必須完全相同。

您的兩個字符串看起來相同,但構造不同,其中一個使用單一Unicode碼位作爲阿拉伯字母ALEF與HAMZA BELOW,另一個使用兩個碼位阿拉伯字母ALEF和阿拉伯哈姆薩以下產生相同字符 - 這些兩種形式分別稱爲預分解和分解。

標準字符串compare:家族的方法(compare:options:localizedCompare:)默認爲考慮由字符,這取一個選項的形式可以被設置通過指定NSLiteralSearch表現得像isEqualToString

所以只要改變你的代碼:

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

,你會得到你所期望的答案。

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

斯威夫特字符串比較處理,可自動:

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

print(string1 == string2) 
// true 
+0

我想你會發現Objective-C也會自動處理這個問題,看看我添加的答案。斯威夫特並不總是更好;-) – CRD

+0

@CRD:你說得對。我*認爲*我嘗試過,但顯然我犯了一些錯誤。你的是正確的答案。 –