2011-07-26 59 views
3

我一直遇到NSStrings不會返回相同的(罕見)情況,儘管它們在控制檯中打印時看起來完全一樣。例如:NSString的奇數結果isEqualToString

[string1 isEqualToString:string2] 
> comparing 'angelo debarre' to 'angelo debarre' 

不斷返回NO。我試過使用NSString的stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet],但仍然沒有運氣。我也試過使用比較器,如compare:localizedCaseInsensitiveCompare:,但我一直得到相同的結果。任何我可能忽略的東西的想法?

+0

一個字符看起來像一個空格,但不是(或另一個Unicode怪異)。考慮將字符串轉儲爲十六進制。現在,如果*這些*值是相同的... – 2011-07-26 03:33:22

回答

7

嘗試使用NSString Unicode規範化函數之一來分解字符串,如- (NSString *)decomposedStringWithCompatibilityMapping。兼容性映射(vs規範映射)應該是你想要的,因爲它將視覺上相似的字符序列分解成相同的基本組件。儘管如此,我還沒有明確地查看一個非破壞性空間是否被歸一化爲一個空間。

編輯:兼容性映射規範化有兩種類型:分解和組成。組成版本是- (NSString *)precomposedStringWithCompatibilityMapping

規範化表KC另外褶皺是在許多情況下不適當傑出的兼容性等效字符之間的區別:不知道哪一個工作在一般較好,但Unicode Standard Annex #15 (Unicode Normalization Forms)的KC/KD形式如下說。例如,半角和全角片假名字符將標準化爲相同的字符串,羅馬數字和它們的字母等值也將標準化。

規範化形式KC和KD不得盲目應用於任意文本。因爲它們會消除許多格式差別,所以它們將阻止往返於許多傳統字符集的往返轉換,除非通過格式化標記取代,否則它們可能會刪除對文本語義非常重要的區別。最好將這些規範化形式看作是大寫或小寫映射:在某些上下文中用於識別核心含義,而且對文本進行修改可能並不總是合適的。它們可以更自由地應用於受限字符集的域。

+0

這似乎只能部分解決我的問題。它解決了我在原始問題中給出的「angelo debarre」例子,但其他案例繼續給我帶來麻煩。 – samvermette

+1

嘗試使用NFKC規範化表單(' - (NSString *)precomposedStringWithCompatibilityMapping')。你能提供另一個例子嗎? – darvids0n

+0

非常好,那個工作!請更新您的答案,我會接受它。謝謝! – samvermette

0

我敢打賭,一個是空間,另一個是非破壞空間。修剪僅刪除前綴和後綴處的字符。這不會影響內部空間。

+0

感謝您告訴我我做錯了什麼,而不是建議一個實際的解決方案:P – samvermette

+0

對不起,先生。看看這裏的白色空間標準化方法:https://github.com/Cocoanetics/NSAttributedString-Additions-for-HTML/blob/master/Classes/NSString+HTML.m – Cocoanetics