7

我有 NSString,我需要制作 NSAttributedString。

NSString 类似于:

bvcx b vcxbcvx bcxvbcxv bvx xbc bcvx bxcv bcxv bcxv bcxv bcvx bcvx bcxvbcvx bvc bcvx bxcv{
NSFont = "\"LucidaGrande 24.00 pt. P [] (0x108768a80) fobj=0x108788880, spc=7.59\"";
NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n    28L,\n    56L,\n    84L,\n    112L,\n    140L,\n    168L,\n    196L,\n    224L,\n    252L,\n    280L,\n    308L,\n    336L\n), DefaultTabInterval 0, Blocks (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0.05, HeaderLevel 0";
}

它是 UTF-8 中的 NSAttributedString。有什么办法吗?

4

1 回答 1

11

您说您从现有的这样的现有字符串中创建了输入字符串NSAttributedString

[NSString stringWithFormat:@"%@", nsattributedstring]

%@格式说明符将消息description发送到nsattributedstring对象。该description方法并非旨在生成可以轻松转换回NSAttributedString对象的字符串。它旨在帮助程序员调试他们的代码。

将对象转换为字符串或字节数组以便以后可以转换回对象的过程称为序列化。使用%@ordescription方法通常不是执行序列化的好方法。如果您真的想反序列化该description方法创建的字符串,则必须编写自己的解析器。据我所知,没有API。

相反,Cocoa 提供了一个旨在序列化和反序列化对象的系统。可以使用该系统序列化的对象符合NSCoding协议。NSAttributedString对象符合NSCoding. 因此,请尝试以这种方式序列化您的原始属性字符串:

NSMutableData *data = [NSKeyedArchiver archivedDataWithRootObject:nsattributedstring];

在需要的地方保存data(这是非人类可读的二进制文件,而不是 UTF-8)。当您需要重新创建属性字符串时,请执行以下操作:

NSAttributedString *fancyText = [NSKeyedUnarchiver unarchiveObjectWithData:data];

如果你正在为 OS X而不是iOS)编程,你有一个选择。RTFFromRange:documentAttributes:您可以使用方法(省略附件)或RTFDFromRange:documentAttributes:方法(包括附件)将属性字符串转换为人类可读的 RTF(富文本格式)。initWithRTF:documentAttributes:然后,您可以使用或将 RTF 数据转换回属性字符串initWithRTFD:documentAttributes:。这些方法在 iOS 上不可用。

如果您正在为 iOS 7.0 或更高版本编程,您可以使用-dataFromRange:documentAttributes:error:fileWrapperFromRange:documentAttributes:error:将属性字符串转换为 RTF/RTFD。您需要在文档中设置NSDocumentTypeDocumentAttributeNSRTFTextDocumentType设置NSRTFDTextDocumentType属性。使用initWithData:options:documentAttributes:error:initWithFileURL:options:documentAttributes:error:转换回NSAttributedString. 这些方法是NSAttributedString UIKit Additions的一部分。

于 2013-05-03T18:24:14.357 回答