Поэтому я использую CoreStore , чтобы сохранить строку identifier
в 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 была сохранена как строка UTF8. Но все еще допустимый как:
> po record.identifier == identifier
true
Проблема возникает позже, когда вы пытаетесь получить record
снова с шведской identifier
строкой UTF16, как оригинал выше, поскольку она больше не соответствует.
CoreStore.fetchOne(From<Record>().where(\.identifier == identifier)) // Fails
Как я могу преобразовать identifier
в представление, которое будет соответствовать сохраненному значению CoreData?
Обновление
Еще более странно, чтожестко закодированный идентификатор преуспевает:
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
и identifer
, и эта закодированная строка совпадает:
po identifier == "filecloud.test@run.se@files.runcloud.se/EXTERNAL/Gemensam RUN/FileCloud Test/Test folder åäö/Test with Swedish characters - åäö.xlsx"
true
Но использование identifier
вместо жестко закодированного не дает.
Обновление 2
Сравнение .unicodeScalars
из identifier
и жестко закодированной строки действительно показывает, что они действительно различаются: