如果编码类型未知,如何将纯文本(.txt)文件转换为字符串?
我正在开发一项功能,允许用户将txt文件导入我的应用程序。这意味着该文件可以在任意数量的应用程序中创建,使用对纯文本文件有效的各种编码。我的理解是这可能包括(ASCII,UTF-8,UTF-16,UTF-16BE,UTF-16LE,UTF-32,UTF-32BE,UTF-32LE或EBCDIC?!)
使用以下内容进展顺利:
NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&errorReading];
然后,用户提供了一个导入时导致空内容的文件。我在XCode调试中看到了该文件,并看到Cocoa错误261,NSStringEncoding = 4.
我所知道的:
种类:文字
文本/无格式;字符集= UTF-16LE
我猜这个文件的utf-16le编码是关键,因为我期待一个NSUTF8文件。 我试图使用ASCII作为最小公分母。它并没有崩溃,而是在一些原始文件中没有的字符中捏造。
NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:&errorReading];
所以我试图首先将文件转换为NSData,希望它可以否定识别编码的需要。它不起作用。
NSData *txtFileData = [NSData dataWithContentsOfFile:path];
NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSUTF8StringEncoding];
这引出了一些问题:
initWithContentsOfFile
的目的,遗憾的是现在已经弃用了NSString *txtFileAsString = nil;
if (path !=nil) {
NSData *txtFileData = [NSData dataWithContentsOfFile:path];
NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSASCIIStringEncoding];
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF8StringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16StringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16LittleEndianStringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF16BigEndianStringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32StringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32LittleEndianStringEncoding];
}
if (!txtFileAsString) {
txtFileAsString = [[NSString alloc] initWithData:txtFileData encoding:NSUTF32BigEndianStringEncoding];
}}
。 ASCIStringEncoding不起作用。假设文件实际上是URF16LE,为什么以下suggestion也不起作用?
{{1}}
答案 0 :(得分:3)
有时stringWithContentsOfFile:usedEncoding:error:
可以完成这项工作(特别是如果文件有Byte Order Mark):
NSError *error;
NSStringEncoding encoding;
NSString *string = [NSString stringWithContentsOfFile:path usedEncoding:&encoding error:&error];
请注意,不应将此usedEncoding
的再现与仅具有encoding
参数的类似命名方法相混淆。