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

Posted

技术标签:

【中文标题】CoreData 错误存储包含 ä、ö、ü、ß 的字符串【英文标题】:CoreData wrong storing string containing ä, ö, ü, ß 【发布时间】:2015-04-30 04:04:12 【问题描述】:

我在 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

【问题讨论】:

你现在如何存储和检索字符串? 我将字符串属性添加到 CoreData 实体。创建了 ManagedObject 子类。还创建了将数据存储到数据库并获取数据的数据库管理器类。 让我提一下,一切都使用英文字母和特殊字符。但是,当我创建包含这 4 个字符的德语本地化时,它们没有使用相同的功能正确保存。 我的意思是,向我们展示如何存储和检索字符串的实现(即代码)。是否对字符串进行了后/预处理? 我用代码更新了问题。没有字符串的前/后处理。我按原样存储它。问题是当我在数据库中存储后立即使用应用程序时一切正常,但是当我重新启动应用程序并从数据库中再次读取它时,字符串没有按应有的方式显示。 【参考方案1】:

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 而不会发生。

【讨论】:

我找到了我的问题,但仍然没有找到解决方案。问题不在于核心数据,也不在于将内容存储到数据库。它在从我连接到的服务器接收到的数据中。接收到的数据从 JSON 解析为 NSDictionary,并使用 valueForKey: 函数作为 NSString 检索。解析的字符串格式错误。全部使用 UTF-8 编码。

以上是关于CoreData 错误存储包含 ä、ö、ü、ß 的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何处理sql数据库中的ß、ö、ä、ü等?

Flutter 创建 API 请求并接收带有 - 'Ä' 'Ö' 'Ü' 'ß' 的字符串

Javascript 正则表达式替换必须保留德语变异元音

cv2 imwrite 和德语字母(“ä, ü, ö”)

如何在列表中打印德语变音符号?

从 PHP 字符串中删除控制字符