3 votes

Comment tirer de manière fiable un fichier texte d'un encodage inconnu dans un NSString sur un iPhone ?

Voici un peu de code que j'utilise pour extraire un fichier texte dans un fichier de type UITextView appelé textView .

Comme je ne peux pas toujours connaître l'encodage du fichier à l'avance, j'utilise la méthode suivante -stringWithContentsOfFile:usedEncoding:error: qui stocke une valeur d'encodage par référence.

Une fois que j'ai le codage, j'ouvre le fichier et, s'il y a une erreur, j'imprime quelques informations :

NSError *_error = nil; 
NSStringEncoding _textEncoding;
NSString *_contentText = [NSString stringWithContentsOfFile:[baseURL path] usedEncoding:&_textEncoding error:&_error];

if (_error) {
    NSLog(@" _error: %@", [_error userInfo]);
    NSLog(@" _textEncoding: %d", _textEncoding);
}

textView.text = _contentText; 

Sur un iPhone si le fichier est encodé en UTF8, la vue texte affiche le contenu du fichier correctement.

Sur un iPhone si un fichier est codé en ASCII ( NSASCIIStringEncoding ), j'obtiens alors une valeur d'encodage de chaîne étrange :

2010-07-23 02:57:46.786 App[9160:307]  _error: {
    NSFilePath = "/var/mobile/Applications/0AD83E02-7A2A-4665-8B8F-17E03EE12B9E/Documents/A+B.txt";
}
2010-07-23 02:57:46.791 App[9160:307]  _textEncoding: 805298632

Para NSASCIIStringEncoding Je devrais obtenir une valeur de 1, et non 805298632.

Le rebondissement est que, si j'ouvre le fichier via le simulateur J'obtiens la valeur d'encodage correcte et la vue texte affiche le contenu du fichier encodé en ASCII.

Je pense que j'ai la bonne syntaxe, mais je suppose que j'ai manqué quelque chose, peut-être évident. Qu'est-ce que je fais de mal ici ?

1voto

falconcreek Points 3657
  1. L'opération stringWithContentsOfFile:usedEncoding:error : échoue. Enregistrez les détails de l'erreur pour déterminer pourquoi.
  2. Le spécificateur de format doit être %lx . NSStringEncoding est un NSUInteger qui est un unsigned long sur l'appareil. Certaines des valeurs énumérées sont des valeurs hexagonales.
  3. Sur quelle plate-forme le fichier est-il créé ? Êtes-vous sûr que l'encodage est bien ASCII ? Vous devrez effectuer un vidage hexadécimal du fichier pour vérifier si l'encodage est valide.
  4. Essayez d'initialiser _textEncoding à 0. Les constantes énumérées commencent à 1.
  5. Ajouter un garde pour tester que la chaîne retournée n'est pas nulle avant de la passer à la vue. Conformément à la documentation le retour est nul s'il y a eu une erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X