The issue might be related to unicode normalization. So Coredata seems to store the string decomposed (so й
counts for 2 - one for the letter and one for the accent) and this is why you get the difference in length. If you try to decompose your original string before comparing it to what Coredata returns, it should work:
[yourOriginalString decomposedStringWithCanonicalMapping]
Now, the reason behind this is beyond my field of expertise. I constantly use coredata for managing my models and have worked multiple times with Greek / Russian strings and never had such an issue. If anyone can expand on this and shed some light I would be also very interested in the subject.