Core data UTF16存储字符串不';一旦从CoreData检索回,则不匹配

Core data UTF16存储字符串不';一旦从CoreData检索回,则不匹配,core-data,utf-8,utf-16,corestore,Core Data,Utf 8,Utf 16,Corestore,因此,我使用在CoreData中保存一个字符串标识符。 该字符串可能包含一些瑞典语UTF16字符。从调试器控制台检查: > po identifier "/EXTERNAL/Gemensam RUN/FileCloud Test/Test folder åäö/Test with Swedish characters - åäö.xlsx" 保存回CoreData后立即: >po record <File: 0x281e140a0> (entity: File; id:

因此,我使用在CoreData中保存一个字符串
标识符
。 该字符串可能包含一些瑞典语UTF16字符。从调试器控制台检查:

> po identifier
"/EXTERNAL/Gemensam RUN/FileCloud Test/Test folder åäö/Test with Swedish characters - åäö.xlsx"
保存回CoreData后立即:

>po record
<File: 0x281e140a0> (entity: File; id: 0xdcac6620f1e9eb63 <x-coredata://BA0168AF-92CE-4AC2-A934-1020E41C5C20/File/p615>; data: {
    // ...
    identifier = "filecloud.test@run.se@files.runcloud.se/EXTERNAL/Gemensam RUN/FileCloud Test/Test folder \U00e5\U00e4\U00f6/Test with Swedish characters - \U00e5\U00e4\U00f6.xlsx";
    // ...
})
当尝试使用UTF16瑞典语
标识符
字符串再次检索
记录时,问题会在稍后出现,因为它不再匹配

CoreStore.fetchOne(From<Record>().where(\.identifier == identifier)) // Fails
identifer
与此硬编码字符串不匹配:

po identifier == "filecloud.test@run.se@files.runcloud.se/EXTERNAL/Gemensam RUN/FileCloud Test/Test folder åäö/Test with Swedish characters - åäö.xlsx"
true
但是使用
标识符
而不是硬编码的标识符则不行

更新2

比较
标识符
.unicodeScalars
和硬编码字符串确实表明它们确实不同:


CoreData保存和返回的字符串完全相同

使用复杂字符检索值的问题是,CordaDa(最有可能的SQLite后面)不认为我的句子是相等的,因为它们有不同。两个句子都是有效的,在Swift中比较相等,但在CoreData中不相等,作为检索对象的值

在Swift中,似乎没有一种正确的方法来转换grapheme群集,因此我的解决方法是重新创建一个过程,首先创建原始grapheme群集。这涉及到首先从字符串中创建一个
URL
,然后让
FileProvider
框架通过调用
persistentiIdentifierForItem(at:URL)!,创建相同的图形集集群!。原始值
。然后使用此值检索保存的对象

CoreStore.fetchOne(From<Record>().where(\.identifier == "filecloud.test@run.se@files.runcloud.se/EXTERNAL/Gemensam RUN/FileCloud Test/Test folder åäö/Test with Swedish characters - åäö.xlsx")) // Works
po identifier == "filecloud.test@run.se@files.runcloud.se/EXTERNAL/Gemensam RUN/FileCloud Test/Test folder åäö/Test with Swedish characters - åäö.xlsx"
true