2011-06-23 226 views
2

有人能告訴我如何用文件保存字節順序標記(BOM)嗎?比如,我保存的文本文件,現在想:將BOM保存到文件

NSString *currentFileContent = @"This is a string of text to represent file content."; 
NSString *currentFileName = @"MyFileName"; 
NSString *filePath = [NSString stringWithFormat:@"%@/%@.%@", [self documentsDirectory], currentFileName, rtf]; 
[currentFileContent writeToFile:filePath atomically:YES encoding:NSUTF16StringEncoding error:&error]; 

我的BOM的理解是:

的BOM字符是 「零寬度 NO-BREAK SPACE」 的字符,U + FEFF,在 的Unicode字符集。

我有一個iPhone應用程序,允許用戶將文本保存到RTF文件。所有工作正常,如果我使用NSUTF8StringEncoding,除非用戶具有雙字節字符,如日語或中文。簡單的答案似乎是使用NSUTF16StringEncoding保存文件,該文件在更新的RTF規範中允許使用,但Microsoft Word只能在定義了BOM時自動打開UTF-16文件。

我的希望是,如果我可以設置一個通用的BOM,我不需要識別用戶的字符集,因爲我無法預先知道這是什麼。但他們仍然能夠打開雙字節字符的RTF文件。

感謝您的建議或意見。

+0

只需在數據前加上0xFEFF(兩個字節)? – 2011-06-23 21:16:01

回答

1

如果您首先將字符串轉換爲數據,然後將數據寫入文件,那麼NSString的dataUsingEncoding:allowLossyConversion:將爲您添加BOM。你可以寫你的文件如下:

NSData *data = [currentFileContent dataUsingEncoding:NSUTF16StringEncoding]; 
[data writeToFile:filePath options:NSDataWritingAtomic error:&error]; 
+0

感謝您的建議。我在NSString類參考中看到「此方法創建一個外部表示(使用字節順序標記,必要時指示endianness)」。所以我會標記這個答案。不幸的是,我的核心問題沒有解決。當我在Word中打開文件時,它仍顯示RTF標記。我可以在TextWrangler中看到它保存爲UTF-16 Little-Endian,但不確定BOM是如何定義的。 – DenVog