2010-08-22 78 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