保存数据到coredata时,出现错误如下:
"Error Domain=NSCocoaErrorDomain Code=1671 \"\U672a\U80fd\U5b8c\U6210\U64cd\U4f5c\U3002\Uff08Cocoa\U9519\U8bef1671\U3002\Uff09\" UserInfo={NSValidationErrorObject=<aaaaaa: 0x280e79bd0> (entity: SortSectionCache; id: 0x282be5d60 <x-coredata:///SortSectionCache/t62A0EB67-A531-4C16-8D06-D58378CBF33330481>; data: <fault>), NSLocalizedDescription=\U672a\U80fd\U5b8c\U6210\U64cd\U4f5c\U3002\Uff08Cocoa\U9519\U8bef1671\U3002\Uff09, NSValidationErrorKey=bbbbbb, NSValidationErrorValue=\Ud83c}",
从错误中分析时因为保存数据 \Ud83c 到字段 bbbbbb 中发生错误
\Ud83d 转换发现是个特殊字符 查询原因发现原始数据如下: \Ud83c\Uddf2\Ud83c\Uddfe xxxxxx 代码中在取这个字符串的首字符时,直接获取了index:
NSString *text = @"\Ud83c\Uddf2\Ud83c\Uddfe xxxxxx";
NSString *firstLetter = [text substringToIndex:1];
导致获取的是非正常字符
解决方法: 使用 NSStringEnumerationByComposedCharacterSequences 来获取第一个可用字符即可
__block NSMutableString *output = [NSMutableString string];
[text enumerateSubstringsInRange:NSMakeRange(0, text.length)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock: ^(NSString *substring, NSRange substringRange, NSRange enclosingRang, BOOL *stop)
{
output = [substring uppercaseString];
*stop = YES;
}];
firstLetter = output;
如果保存到coredata出现这个错误,不妨往特殊字符或者截断字符的方向去查。