NSString stringWithContentsOfFile:fileName非英文字母

时间:2012-06-10 07:02:50

标签: iphone objective-c

我有一个文件,其中许多行以“\ n”分隔。其中一条线是:

Christian Grundekjøn

除非我删除该行,否则无法读取该文件。我使用以下代码逐行阅读:

for (NSString *line in [[NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:NULL] componentsSeparatedByString:@"\n"])

如果我不删除该行,代码甚至根本不会进入for循环。什么都没看过。如何处理非英文字母?

3 个答案:

答案 0 :(得分:2)

如果要从iOS中生成文本文件,则需要确保使用NSUTF8StringEncoding对其进行编码。但鉴于您正在报告的问题,我怀疑您可能从其他来源提取数据并且该来源未将文本编码为UTF8。如果是这种情况,您可以在应用程序外修复问题,但将源文件转换为UTF8。

如果您不知道使用了什么编码,例如因为用户提供了该文件,iOS可以尝试为您猜测。我成功使用的模式是首先尝试使用UTF8编码获取字符串,例如使用您使用的相同方法。假设您编写了一个传递文件名的方法,以获取类似于以下内容的字符串:

- (NSString*) stringFromFile: (NSString*) filePath;
{    
     NSError* error = nil;
     NSString* stringFromFile = [NSString stringWithContentsOfFile: fileName
                                                          encoding: NSUTF8StringEncoding
                                                             error: &error];

     if (stringFromFile) return stringFromFile; // success

     NSLog(@"String is not UTF8 encoded. Error: %@", [error localizedDescription]);

     NSStringEncoding encoding = 0;
     NSError* usedEncodingError = nil;

     NSString* stringFromFile = [NSString stringWithContentsOfFile: path
                                                      usedEncoding: &encoding 
                                                             error: &usedEncodingError];

    if (stringFromFile)
    {
        NSLog(@"Retrieved string using an alternative encoding. Encoding was: %d", encoding);
        return stringFromFile;
    }

   // either handle error or attempt further explicit unencodings here

   return nil;
}

在许多情况下,usedEncoding效果很好。但是有一些边缘情况,试图找出编码可能非常棘手。这一切都取决于源文件。

答案 1 :(得分:1)

我遇到日文字符问题。我的解决方案是将文件保存到doc目录

NSString *fileData = [NSString stringWithFormat:@"%@", noteContent];
BOOL isWriteToFile = [fileData writeToFile:notePath atomically:YES encoding:NSUTF8StringEncoding error:nil];

阅读文件内容时

[[NSString alloc] initWithContentsOfFile:fullNotePath usedEncoding:nil error:nil];

答案 2 :(得分:0)

在文件中,以unicode格式存储您的数据,或者您也可以unicode格式存储特殊字符。