我有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。有什么方法可以做到吗?
答案 0 :(得分:9)
您说您是从现有的NSAttributedString
创建了输入字符串,如下所示:
[NSString stringWithFormat:@"%@", nsattributedstring]
%@
格式说明符将description
消息发送到nsattributedstring
对象。 description
方法的目的不是生成一个可以轻松转换回NSAttributedString
对象的字符串。它旨在帮助程序员调试代码。
将对象转换为字符串或字节数组以便以后可以将其转换回对象的过程称为序列化。使用%@
或description
方法通常不是执行序列化的好方法。如果您确实要反序列化description
方法创建的字符串,则必须编写自己的解析器。据我所知,没有API。
相反,Cocoa提供了一个用于序列化和反序列化对象的系统。可以使用此系统序列化的对象符合NSCoding
协议。 NSAttributedString
个对象符合NSCoding
。因此,请尝试以这种方式序列化原始属性字符串:
NSMutableData *data = [NSKeyedArchiver archivedDataWithRootObject:nsattributedstring];
在您需要的地方保存data
(非人类可读的二进制文件,而不是UTF-8)。当您需要重新创建属性字符串时,请执行以下操作:
NSAttributedString *fancyText = [NSKeyedUnarchiver unarchiveObjectWithData:data];
如果您正在为OS X编程(不是 iOS),您可以选择其他方式。您可以使用RTFFromRange:documentAttributes:
method(省略附件)或RTFDFromRange:documentAttributes:
method(包括附件)将属性字符串转换为RTF(富文本格式),这是人类可读的。然后,您可以使用initWithRTF:documentAttributes:
或initWithRTFD:documentAttributes:
将RTF数据转换回属性字符串。这些方法在iOS上不可用。
如果您使用的是iOS 7.0或更高版本,则可以使用-dataFromRange:documentAttributes:error:
或fileWrapperFromRange:documentAttributes:error:
将属性字符串转换为RTF / RTFD。您需要在文档属性中将NSDocumentTypeDocumentAttribute
设置为NSRTFTextDocumentType
或NSRTFDTextDocumentType
。使用initWithData:options:documentAttributes:error:
或initWithFileURL:options:documentAttributes:error:
转换回NSAttributedString
。这些方法是NSAttributedString UIKit Additions。