2013-02-27 17 views
1

我需要將RTFD字符串(通常簡寫爲)嵌入到XML文件中。爲XML編碼RTFD

XMLWriter writer(...) 

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

writer.Write(rtfd); 

RTFD使我們無法保證(按照我的理解 - 我似乎無法找到標準DOC),該數據字節將是安全的,即使作爲CDATA - 或者實際上表示的是UTF8。我應該如何編碼它們?

目標包括:

  • 人類可讀性
  • 緊湊
  • 編碼和解碼

雖然清楚地折衷可能是必要的速度。

回答

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

+0

除非我弄錯了,initWithData:指定在編碼之前編碼DATA的編碼,所以這不起作用,例如,如果圖像附着有一個字節序列對於UTF8是非法的 – 2013-02-28 01:47:29

+0

當創建數據時,'NSCharacterEncodingDocumentAttribute'設置爲'NSUTF8StringEncoding',所以數據被編碼爲UTF8,即任何這樣的字節序列在數據創建期間被平坦化。 – 2013-02-28 18:02:10

+0

我不認爲這會工作:NSCharacterEncodingDocumentAttribute描述正在讀取的文檔的編碼:「這些選項鍵被識別爲使用initWithData:選項導入文檔:documentAttributes:error:,initWithHTML:options:documentAttributes:,initWithURL:options:documentAttributes :error:或readFrom ...方法(例如readFromData:options:documentAttributes :)由NSMutableAttributedString實現。 – 2013-02-28 19:24:38

0

看來有沒有一個很好的答案。

屬性列表序列化程序使用的NSData的description方法寫入十六進制轉儲。這是可靠和XML安全的,但不夠緊湊或清晰。

我目前使用Base64編碼,它不緊湊(但優於十六進制),不易讀,但也完全安全的XML。

ISTM是UTF8應該很容易適合以Base256-37 = Base219編碼,在這裏我們忽略控制字符00-31,並以XML(<>「」&)是特殊的字符。我缺少的東西,或者有沒有一個好的名字呢?