Convertir le file TXT du encoding inconnu en string

Comment puis-je convertir des files text brut (.txt) en une string si le type d'enencoding est inconnu?

Je travaille sur une fonctionnalité qui permettrait aux users d'importer des files txt dans mon application. Cela signifie que le file a pu être créé dans n'importe quel nombre d'applications, en utilisant l'un des différents enencodings qui seraient considérés comme valides pour un file en text brut. Ma compréhension est que cela pourrait inclure (ASCII, UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, ou EBCDIC?!)

Les choses allaient bien en utilisant ce qui suit:

NSSsortingng *txtFileAsSsortingng = [NSSsortingng ssortingngWithContentsOfFile:path encoding:NSUTF8SsortingngEncoding error:&errorReading]; 

Ensuite, un user a fourni un file qui a généré un contenu vide lors de l'import. J'ai regardé le file dans le debugging XCode, et voir une erreur Cocoa 261, NSSsortingngEncoding = 4.

Ce que je sais:

  • Le file fourni par l'user a été créé avec une application appelée knowtes
  • Le file s'ouvre avec TextEdit, TextWranger, etc. sur Mac OS X
  • Le file contient des "caractères spéciaux" tels que des trémas (rant: pourquoi le "u" sur tréma n'a-t-il pas de tréma ?!)
  • Les informations du Finder s'affichent:

Genre: text

  • Sorties Terminal -I :

text simple; jeu de caractères = utf-16le

Je devine que l'enencoding utf-16le du file est la key, car je m'attends à un file NSUTF8. J'ai essayé d'utiliser ASCII comme un plus petit dénominateur commun. Il ne s'est pas écrasé, mais a trafiqué certains caractères qui n'étaient pas présents dans le file d'origine.

 NSSsortingng *txtFileAsSsortingng = [NSSsortingng ssortingngWithContentsOfFile:path encoding:NSASCIISsortingngEncoding error:&errorReading]; 

J'ai donc d'abord tenté de convertir le file en NSData, en espérant qu'il pourrait annuler le besoin de reconnaître l'enencoding. Cela n'a pas fonctionné.

  NSData *txtFileData = [NSData dataWithContentsOfFile:path]; NSSsortingng *txtFileAsSsortingng = [[NSSsortingng alloc]initWithData:txtFileData encoding:NSUTF8SsortingngEncoding]; 

Cela m'amène à quelques questions:

  1. N'existe-t-il pas un moyen universel de convertir le contenu d'un file text brut, quel que soit le encoding, en une string (c'est-à-dire le plus petit dénominateur commun)? Je crois que c'était le but initWithContentsOfFile , qui est malheureusement maintenant obsolète. ASCISsortingngEncoding n'a pas fonctionné.
  2. Y a-t-il quelque chose à propos de la conversion d'un file codé NSUTF16 en une string que je devrais gérer différemment que si c'était NSUTF8?
  3. En supposant que le file est en fait URF16LE, pourquoi la suggestion suivante ne fonctionne pas non plus?

     NSSsortingng *txtFileAsSsortingng = nil; if (path !=nil) { NSData *txtFileData = [NSData dataWithContentsOfFile:path]; NSSsortingng *txtFileAsSsortingng = [[NSSsortingng alloc]initWithData:txtFileData encoding:NSASCIISsortingngEncoding]; if (!txtFileAsSsortingng) { txtFileAsSsortingng = [[NSSsortingng alloc] initWithData:txtFileData encoding:NSUTF8SsortingngEncoding]; } if (!txtFileAsSsortingng) { txtFileAsSsortingng = [[NSSsortingng alloc] initWithData:txtFileData encoding:NSUTF16SsortingngEncoding]; } if (!txtFileAsSsortingng) { txtFileAsSsortingng = [[NSSsortingng alloc] initWithData:txtFileData encoding:NSUTF16LittleEndianSsortingngEncoding]; } if (!txtFileAsSsortingng) { txtFileAsSsortingng = [[NSSsortingng alloc] initWithData:txtFileData encoding:NSUTF16BigEndianSsortingngEncoding]; } if (!txtFileAsSsortingng) { txtFileAsSsortingng = [[NSSsortingng alloc] initWithData:txtFileData encoding:NSUTF32SsortingngEncoding]; } if (!txtFileAsSsortingng) { txtFileAsSsortingng = [[NSSsortingng alloc] initWithData:txtFileData encoding:NSUTF32LittleEndianSsortingngEncoding]; } if (!txtFileAsSsortingng) { txtFileAsSsortingng = [[NSSsortingng alloc] initWithData:txtFileData encoding:NSUTF32BigEndianSsortingngEncoding]; }} 

Parfois ssortingngWithContentsOfFile:usedEncoding:error: peut faire le travail (surtout si le file a une marque de command d'octet ):

 NSError *error; NSSsortingngEncoding encoding; NSSsortingng *ssortingng = [NSSsortingng ssortingngWithContentsOfFile:path usedEncoding:&encoding error:&error]; 

Notez que ce rendu avec usedEncoding ne doit pas être confondu avec la méthode nommée de la même façon qui a juste un paramètre de encoding .