如何使用指定的NSString编码在Cocoa中保存文本文档?

时间:2011-03-12 10:38:48

标签: objective-c cocoa encoding nsdata textedit

我正在尝试为Mac OS X创建一个简单的文本编辑器,如Textedit,但经过几个小时的研究无法弄清楚如何正确地将文档的数据写入文件。我正在使用Cocoa框架,我的应用程序是基于文档的。在Cocoa API中查看我发现了一个简短的教程,“在15分钟内构建文本编辑器”或类似的东西,它实现了以下方法将数据写入文件:

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
    [textView breakUndoCoalescing];
    NSAttributedString *string=[[textView textStorage] copy];
    NSData *data;
    NSMutableDictionary *dict=[NSDictionary dictionaryWithObject:NSPlainTextDocumentType forKey:NSDocumentTypeDocumentAttribute];
    data=[string dataFromRange:NSMakeRange(0,[string length]) documentAttributes:dict error:outError];
    return data;
}

这只是工作正常,但我想让用户选择文本编码。我想这种方法使用“自动”编码,但是如何使用预定义的编码来编写数据呢?我尝试使用以下代码:

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
    [textView breakUndoCoalescing];
    NSAttributedString *string=[[textView textStorage] copy];
    NSData *data;
    NSInteger saveEncoding=[prefs integerForKey:@"saveEncoding"];
    // if the saving encoding is set to "automatic"
    if (saveEncoding<0) {
        NSMutableDictionary *dict=[NSDictionary dictionaryWithObject:NSPlainTextDocumentType forKey:NSDocumentTypeDocumentAttribute];
        data=[string dataFromRange:NSMakeRange(0,[string length]) documentAttributes:dict error:outError];
    // else use the encoding specified by the user
    } else {
        NSMutableDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:NSPlainTextDocumentType,NSDocumentTypeDocumentAttribute,saveEncoding,NSCharacterEncodingDocumentAttribute,nil];
        data=[string dataFromRange:NSMakeRange(0,[string length]) documentAttributes:dict error:outError];
    }
    return data;
}

如果用户未设置特定编码,则saveEncoding为-1,否则[NSString availableStringEncodings]中列出的编码之一。但每当我尝试使用与UTF8不同的编码保存我的文档时,应用程序崩溃。当我尝试使用以下代码对文档进行编码时,会发生同样的情况:

NSString *string=[[textView textStorage] string];
data=[string dataUsingEncoding:saveEncoding];

我做错了什么?如果有人知道Textedit如何解决这个问题会很棒。

1 个答案:

答案 0 :(得分:1)

也许您还记得NSDictionary只能存储对象......

NSMutableDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
  NSPlainTextDocumentType,
    NSDocumentTypeDocumentAttribute,
  [NSNumber numberWithInteger:saveEncoding],
    NSCharacterEncodingDocumentAttribute,
  nil];