我需要在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。我该怎么编码呢?
目标包括:
虽然明确妥协可能是必要的。
答案 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;)。我是遗失了什么,或者有一个好名字?