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:
Genre: text
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:
initWithContentsOfFile
, qui est malheureusement maintenant obsolète. ASCISsortingngEncoding n'a pas fonctionné. 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
.