使用NSFileHandle创建UTF8文本文件时出现问题

时间:2010-08-22 01:23:46

标签: objective-c cocoa

我想使用NSFileHandle来编写大型文本文件,以避免在内存中处理非常大的NSString。我遇到问题,在创建文件并在文本编辑应用程序(Mac)中打开它后,它没有正确显示unicode字符。如果我使用NSString writeToFile:atomically:encoding:error:方法将相同的文本写入文件,则文本编辑会正确显示所有内容。

我打开文本编辑中的两个文件,其中“打开文件编码”选项设置为自动,所以我不确定为什么一个工作而另一个方法没有。是否有某种形式的标头声明格式为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]];

1 个答案:

答案 0 :(得分:2)

问题不在于您的代码,而在于TextEdit:它不会尝试将文件解码为UTF-8,除非它有一个UTF-8 BOM标识它。据推测,您的代码的第一个版本添加了这样的BOM。有关进一步的讨论,请参阅this question

UTF-8数据通常不应包含BOM,因此您可能不应该从第二个版本修改代码 - 它正常工作。如果在TextEdit 中打开文件工作,你应该能够通过在字符串的开头明确地包含它(\ufeff)来强制BOM,但是,你不应该除非你真的需要,否则这样做。