来自NSString的isEqualToString的奇怪结果

时间:2011-07-26 03:25:53

标签: iphone string

我经常遇到(罕见)NSStrings不会返回相同的情况,尽管它们在控制台中打印时看起来完全相同。例如:

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

不断返回NO。我尝试过使用NSString的stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet],但仍然没有运气。我也尝试使用compare:localizedCaseInsensitiveCompare:之类的比较器,但我仍然得到相同的结果。对我可能会忽略的事情有任何想法吗?

2 个答案:

答案 0 :(得分:7)

尝试使用NSString Unicode规范化函数之一分解字符串,例如- (NSString *)decomposedStringWithCompatibilityMapping。兼容性映射(与规范映射)应该是您想要的,因为它将视觉上相似的字符序列分解为相同的基本组件。但是,我没有明确地查看是否将非破坏空间规范化为空间。

编辑:兼容性映射规范化有两种类型:分解和组合。组合版本为- (NSString *)precomposedStringWithCompatibilityMapping。不确定哪一个在一般情况下效果更好,但Unicode Standard Annex #15 (Unicode Normalization Forms)表示以下KC / KD形式:

  

规范化表格KC还可以折叠在许多情况下不恰当地区分的兼容性等效字符之间的差异。例如,半角和全角片假名字符将标准化为相同的字符串,罗马数字和它们的字母等价。

     

规范化表格KC和KD不得盲目地应用于任意文本。因为它们会消除许多格式区别,所以它们会阻止往返许多遗留字符集的往返转换,除非通过格式化标记取代,否则它们可能会删除对文本语义重要的区别。最好将这些规范化表单视为大写或小写映射:在某些上下文中用于识别核心含义,但也可能对文本执行可能并不总是合适的修改。它们可以更自由地应用于具有受限字符集的域。

答案 1 :(得分:0)

我敢打赌,一个是空间,另一个是不间断的空间。修剪仅删除前缀和后缀的聊天。这不会影响内部空间。