代码之家  ›  专栏  ›  技术社区  ›  Michael Waterfall

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

  •  1
  • Michael Waterfall  · 技术社区  · 16 年前

    我想用 NSFileHandle 编写大型文本文件以避免处理非常大的文件 NSString 在记忆中。我遇到一个问题,在创建文件并在文本编辑应用程序(Mac)中打开它之后,它无法正确显示unicode字符。如果我使用 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 回复  |  直到 16 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    问题不在于代码,而在于TextEdit:它不会尝试将文件解码为UTF-8,除非它有一个UTF-8bom来标识它。大概,您的代码的第一个版本添加了这样一个BOM。看到了吗 this question

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