将未知编码的TXT文件转换为字符串

如果编码类型未知,如何将纯文本(.txt)文件转换为字符串?

我正在开发一项function,允许用户将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。

我知道的:

  • 用户提供的文件是使用名为knowtes的应用程序创建的
  • 该文件在Mac OS X上以TextEdit,TextWranger等打开
  • 该文件包含“特殊字符”,如变音符号(咆哮:为什么变音符号上的“u”不具有变音符号?!)
  • Finder信息显示:

种类:文字

  • 终端-I输出:

文本/无格式; 字符集= 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]; 

这引出了几个问题:

  1. 是否没有通用的方法将纯文本文件内容(无论编码)转换为字符串(即最小公分母)? 我相信曾经是initWithContentsOfFile的目的,遗憾的是现在不推荐使用它。 ASCIStringEncoding不起作用。
  2. 有没有什么关于将NSUTF16编码文件转换为字符串,我需要处理的方式与NSUTF8不同?
  3. 假设文件实际上是URF16LE,为什么以下建议也不起作用?

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

有时stringWithContentsOfFile:usedEncoding:error:可以完成这项工作(特别是如果文件有字节顺序标记 ):

 NSError *error; NSStringEncoding encoding; NSString *string = [NSString stringWithContentsOfFile:path usedEncoding:&encoding error:&error]; 

注意,使用usedEncoding这种再现不应该与仅具有encoding参数的类似命名的方法混淆。