Convertir archivo TXT de codificación desconocida a cadena

¿Cómo puedo convertir archivos de texto sin formato (.txt) a una cadena si se desconoce el tipo de codificación?

Estoy trabajando en una función que permitiría a los usuarios importar archivos txt a mi aplicación. Esto significa que el archivo podría haberse creado en cualquier número de aplicaciones, utilizando cualquiera de una variedad de codificaciones que se considerarían válidas para un archivo de texto sin formato. Entiendo que esto podría incluir (¿ASCII, UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE o EBCDIC ?!)

Las cosas habían ido bien usando lo siguiente:

NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&errorReading];

Luego, un usuario proporcionó un archivo que resultó en contenido vacío cuando se importó. Observé el archivo en la depuración de XCode y vi un error de Cocoa 261, NSStringEncoding = 4.

Lo que yo sé:

El archivo proporcionado por el usuario se creó con una aplicación llamada knowtesEl archivo se abre con TextEdit, TextWranger, etc. en Mac OS XEl archivo contiene "caracteres especiales" como diéresis (despotricar: ¿por qué la "u" en diéresis no tiene diéresis ?!)Buscador de información muestra:

Tipo: texto

Terminal -I salidas:

Texto sin formato; charset = utf-16le

Supongo que la clave es la codificación utf-16le del archivo, ya que espero un archivo NSUTF8. Intenté usar ASCII como el mínimo común denominador. No se bloqueó, pero falsificó algunos caracteres que no estaban presentes en el archivo original.

NSString *txtFileAsString = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:&errorReading];

Así que intenté convertir el archivo a NSData primero, con la esperanza de que pudiera negar la necesidad de reconocer la codificación. No funcionó.

    NSData *txtFileData = [NSData dataWithContentsOfFile:path];
    NSString *txtFileAsString = [[NSString alloc]initWithData:txtFileData encoding:NSUTF8StringEncoding];

Esto me lleva a algunas preguntas:

¿No hay una forma universal de convertir el contenido del archivo de Texto sin formato, independientemente de la codificación, en una cadena (es decir, el mínimo común denominador)? Creo que ese era el propósitoinitWithContentsOfFile , que lamentablemente ahora está en desuso. La codificación ASCIString no funcionó.¿Hay algo acerca de convertir un archivo codificado NSUTF16 a una cadena que tendría que manejar de manera diferente que si fuera NSUTF8?

Suponiendo que el archivo es de hecho URF16LE, ¿por qué lo siguientesugerencia no funciona tampoco?

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta