特殊字符导致的NSCocoaErrorDomain Code=1671 错误

1,002 阅读1分钟

保存数据到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出现这个错误,不妨往特殊字符或者截断字符的方向去查。