保存在Core Data中后字符串长度更改

Wer*_*1go 5 core-data objective-c nsstring nsstringencoding

所以这是一个问题.

我有一个字符串

    ????? ????-0.fb2
Run Code Online (Sandbox Code Playgroud)

NSString方法长度返回16

在Core Data中保存字符串后(后端--sqlite)

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

    ????? ????-0.fb2
Run Code Online (Sandbox Code Playgroud)

显然方法是isEqualToString:返回NO

花了很多时间在实验中,我很遗憾这个问题是这封信:

    ?
Run Code Online (Sandbox Code Playgroud)

删除此信解决问题.

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

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

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

以及dosnt工作的解决方法:

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

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

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

All*_*ian 3

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

\n\n
[yourOriginalString decomposedStringWithCanonicalMapping]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n