2010-08-22 100 views
1

我想使用NSFileHandle來編寫大型文本文件,以避免在內存中處理非常大的NSString。我在創建文件並在文本編輯應用程序(Mac)中打開文件後遇到了問題,它沒有正確顯示unicode字符。如果我使用NSStringwriteToFile:atomically:encoding:error:方法將相同文本寫入文件,則文本編輯將正確顯示所有內容。使用NSFileHandle創建UTF8文本文件時出現問題

我打開文本編輯中的「打開文件編碼」選項設置爲自動,這兩個文件,所以我不知道爲什麼一個工作,而另一種方法沒有。是否有某種形式的頭聲明格式爲UTF8?

// Standard string 
NSString *myString = @"This is a test with a star character \u272d"; 

// This works fine 
// Displays: "This is a test with a star character ✭" in Text Edit 
[myString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding]; 

// This doesn't work 
// Displays: "This is a test with a star character ‚ú≠" in Text Edit 
[fileManager createFileAtPath:path contents:nil attributes:nil]; 
fileHandle = [NSFileHandle fileHandleForWritingAtPath:path]; 
[fileHandle writeData:[myString dataUsingEncoding:NSUTF8StringEncoding]]; 
+0

當你完成它時,不要忘記發送該文件句柄'closeFile'消息。 – 2010-08-22 05:15:53

回答

2

問題不在於你的代碼,但文字編輯:它不嘗試將文件作爲UTF-8解碼,除非它有一個UTF-8 BOM確定它是這樣。據推測,您的代碼的第一個版本添加了這樣的BOM。進一步討論見this question

UTF-8數據一般不應該包含BOM,所以你可能根本不應該從第二個版本修改你的代碼 - 它工作正常。如果在TextEdit 中打開該文件,可以正常工作,您應該可以通過在字符串開頭明確包含該文件(\ufeff)強制BOM,但是,除非您確實需要,否則不應該這樣做。

+1

非常好,謝謝你的回答和其他問題的鏈接!我明白爲什麼現在正在發生。我檢查了2個創建的文件,以查看NSString方法是否創建BOM。原來它不是,但它確實設置了擴展屬性。我創建了一個NSString類別來設置這個標誌(改編自我在網上找到的一些代碼)http://gist.github.com/543667希望這可以幫助其他人解決這個問題! – 2010-08-22 11:28:27

+0

只是一個簡單的問題,我查了BOM,UTF-8被稱爲'EF BB BF'。所以我只是想知道'\ ufeff'輸出'EF BB BF'?謝謝! – 2010-09-15 14:59:16

+0

UTF-8是一種編碼;編碼將字符轉換爲字節。 '\ ufeff'是一個字符; 'ef bb ff'是一個字節序列。這是將該字符轉換爲該序列的編碼。如果您想知道該轉換如何工作,請參閱Unicode標準的第3章。 http://unicode.org/versions/latest/ – 2010-09-15 17:28:47

相關問題