5

所以这里有一个问题。

我有一个字符串

    Белый Клык-0.fb2

NSString 方法长度返回 16

在核心数据中保存字符串后(后端 - sqlite)

NSString 方法长度返回 17,但视觉上字符串保持不变

    Белый Клык-0.fb2

显然方法 isEqualToString: return NO

在花了很多时间进行实验之后,我确定问题出在这封信上:

    й

删除这封信可以解决问题。

但它一直让我发疯,为什么会发生这样的事情?

这里的解决方法有效,但不满足我:

  1. stringByReplacingPercentEscapesUsingEncoding: - 需要在数据库查询中和之后转换字符串
  2. 音译整个字符串 - 有点黑客

这里是 dosnt 有效的解决方法:

  1. stringWithUTF8String
  2. 将转义的 UTF8 字符转换回其原始形式

请帮助我了解在 Core Data 中保存后字符串发生了什么。

还有更优雅的解决方案吗?

4

1 回答 1

3

该问题可能与unicode normalization有关。所以 Coredata 似乎存储了分解后的字符串(所以й计数为 2 - 一个用于字母,一个用于重音),这就是为什么你得到长度差异的原因。如果您在将原始字符串与 Coredata 返回的内容进行比较之前尝试分解原始字符串,它应该可以工作:

[yourOriginalString decomposedStringWithCanonicalMapping]

现在,这背后的原因超出了我的专业领域。我经常使用 coredata 来管理我的模型,并且多次使用希腊/俄语字符串,从未遇到过这样的问题。如果有人可以对此进行扩展并阐明一些观点,我也会对这个主题非常感兴趣。

于 2013-02-25T09:26:35.207 回答