2012-06-10 103 views
2

我有一個文件,多行用「\ n」分隔。其中一行是:NSString stringWithContentsOfFile:fileName非英文字母

Christian Grundekjøn 

除非刪除該行,否則無法讀取該文件。我用下面的代碼按行讀入行:

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

如果我不刪除該行,該代碼甚至不會進入for循環的。沒有讀到。如何處理非英文字母?

+0

是什麼結果「[:文件名編碼:NSUTF8StringEncoding錯誤NULL的NSString stringWithContentsOfFile]」我的解決辦法問題 –

+0

是的,這聽起來像你的文件實際上不是UTF-8。 – Wevah

回答

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工作得很好。但有些邊緣情況下,試圖找出編碼可能非常棘手。這一切都取決於源文件。

0

在該文件中,以unicode格式存儲您的數據,或者您還可以以unicode格式存儲特殊字符。

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];