编码RTFD for XML

时间:2013-02-27 21:11:44

标签: xml cocoa rtf nsattributedstring

我需要在XML文件中嵌入RTFD字符串(通常很短)。

XMLWriter writer(...)

NSAttributedString *ns=.....
NSRange all=NSMakeRange(0,[s length]);
NSData *rtfd=[s RTFDFromRange:all documentAttributes:nil];

writer.Write(rtfd);

RTFD无法保证(据我所知 - 我似乎无法找到标准文档)数据字节即使是CDATA也是安全的 - 或者实际上可以表示为UTF8。我该怎么编码呢?

目标包括:

  • 人类可读性
  • 紧凑
  • 编码和解码速度

虽然明确妥协可能是必要的。

2 个答案:

答案 0 :(得分:0)

<强>更新 这实际上只适用于RTF,而不适用于RTFD。也就是说,如果[ns containsAttachments],则最终可能无法创建rtfString


您可以在创建RTFD时指定一些选项以使其采用UTF8编码。

这段代码对我们来说效果很好(虽然我们正在使用属性列表序列化):

NSAttributedString *ns = ...;
NSError *error = nil;
NSString *rtfString = nil;
NSData *rtfdData = [ns dataFromRange:NSMakeRange(0, [ns length])
                   documentAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                       NSRTFDTextDocumentType, NSDocumentTypeDocumentOption,
                                       [NSNumber numberWithInt:NSUTF8StringEncoding], NSCharacterEncodingDocumentAttribute,
                                           nil]
                                error:&error];
if (error == nil) {
    rtfString = [[[NSString alloc] initWithData: rtfdData encoding:NSUTF8StringEncoding] autorelease];
}

然后,writer.Write(rtfString);

答案 1 :(得分:0)

似乎没有一个很好的答案。

属性列表序列化程序使用的NSData description方法写入十六进制转储。这是可靠的,XML安全,但不紧凑或清晰。

我目前正在使用Base64编码,它不紧凑(但比十六进制更好)并且不易读,但对XML也非常安全。

ISTM认为UTF8应该很容易适应Base256-37 = Base219编码,我们省略了控制字符00-31以及XML中特殊的字符(&lt;&gt;“&amp;)。我是遗失了什么,或者有一个好名字?