2

我有一个由“\n”分隔的多行文件。其中一条是:

Christian Grundekjøn

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

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

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

4

3 回答 3

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 效果很好。但是在某些极端情况下,试图找出编码可能非常棘手。这一切都取决于源文件。

于 2012-06-10T08:50:28.163 回答
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];
于 2012-06-10T09:18:41.303 回答
0

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

于 2012-06-10T07:16:21.593 回答