CoreData错误存储包含ä,ö,ü,ß的字符串

时间:2015-02-27 12:29:01

标签: ios objective-c core-data

我在CoreData数据库中存储ä,ö,ü,ß字符时遇到问题,稍后以正确的形式读取它们并以UILabel形式显示为文本。我存储为NSString,例如“äüß”,但由于从数据库中读取,我得到了奇怪的字符。知道如何读取NSString属性的正确值吗?

更新:

存储到CoreData数据库:

OCDatabaseFloor *floor = (OCDatabaseFloor*) [NSEntityDescription insertNewObjectForEntityForName:FLOOR_ENTITY_NAME inManagedObjectContext:managedObjectContext];
[floor setFloorName:floorName];

[self saveContext];

保存上下文功能正在保存对数据库的更改。

从数据库楼层对象中检索:

NSFetchRequest *fetch = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:FLOOR_ENTITY_NAME inManagedObjectContext:managedObjectContext];
[fetch setEntity:entity];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"floorID == %d",[floorID intValue]];
[fetch setPredicate:pred];
NSArray *floors = [managedObjectContext executeFetchRequest:fetch error:nil];
return [floors objectAtIndex:0];

和类OCDatabaseFloor:

@interface OCDatabaseFloor : NSManagedObject

@property (nonatomic, retain) NSNumber * floorID;
@property (nonatomic, retain) NSString * floorName;
@end

1 个答案:

答案 0 :(得分:2)

核心数据本身对这些字符没有任何问题。作为测试,我创建了一个演示项目,其中一个名为Entity的实体具有一个属性,一个名为name的字符串。然后我运行了这段代码:

NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:self.managedObjectContext];
[obj setValue:@"äüß" forKey:@"name"];

NSError *saveError = nil;
if (![self.managedObjectContext save:&saveError]) {
    NSLog(@"Save error: %@", saveError);
} else {
    [self.managedObjectContext reset];

    NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];

    NSError *fetchError = nil;
    NSArray *results = [self.managedObjectContext executeFetchRequest:fr error:&fetchError];
    if (results == nil) {
        NSLog(@"Fetch error: %@", fetchError);
    } else {
        for (NSManagedObject *obj in results) {
            NSLog(@"Name: %@", [obj valueForKey:@"name"]);
        }
    }
}

结果是:

2015-02-27 10:31:03.759 Junk[4808:25603285] Name: äüß

因此,您的字符串已损坏,但必须在将其保存到Core Data之前或在您将其读回之后发生。

看起来你正在混淆某处的字符编码。你提到“ö”被破坏为“¶”。在UTF-8中,“ö”表示为0xC3B6。在UTF-16中,“Ô是0xC3而“¶”是0xB6。所以在某些时候你将UTF-8与UTF-16混合在一起,但由于Core Data而没有发生这种情况。