1

我需要在 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。我应该如何编码它们?

目标包括:

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

尽管显然妥协可能是必要的。

4

2 回答 2

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);

于 2013-02-28T00:17:47.273 回答
0

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

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

我目前正在使用 Base64 编码,它不紧凑(但比十六进制更好)并且不清晰,但对于 XML 来说也是完全安全的。

ISTM 认为 UTF8 应该很容易适应 Base256-37=Base219 编码,其中我们省略了控制字符 00-31 以及 XML 中的特殊字符( < > " ' & )。我是否遗漏了什么,或者是否存在一个好名字?

于 2013-03-01T16:09:30.303 回答