CoreData 错误存储包含 ä、ö、ü、ß 的字符串
CoreData wrong storing string containing ä, ö, ü, ß
我在 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];
和class OCDatabaseFloor:
@interface OCDatabaseFloor : NSManagedObject
@property (nonatomic, retain) NSNumber * floorID;
@property (nonatomic, retain) NSString * floorName;
@end
Core Data 本身对这些字符没有任何问题。作为测试,我创建了一个演示项目,其中包含一个名为 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 而不会发生这种情况。
我在 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];
和class OCDatabaseFloor:
@interface OCDatabaseFloor : NSManagedObject
@property (nonatomic, retain) NSNumber * floorID;
@property (nonatomic, retain) NSString * floorName;
@end
Core Data 本身对这些字符没有任何问题。作为测试,我创建了一个演示项目,其中包含一个名为 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 而不会发生这种情况。