samedi 28 janvier 2012

Codages Pouvez-vous Byte

Il est 2008, pas vrai? Je veux dire, dans cette journée et l'âge, ce n'est pas totalement déraisonnable de s'attendre à ce que NSString à défaut d'utiliser une NSUTF8StringEncoding comme encodage par défaut lors du chargement d'un fichier s'il ne peut pas déterminer l'encodage, non? Je veux dire, depuis un fichier ASCII se charger correctement en utilisant UTF-8, mais pas vice versa, UTF-8 semble être la meilleure hypothèse ou, du moins, une meilleure prise en charge de l'ASCII.

Eh bien, il pourrait être "raisonnable" supposition, mais c'est une autre incorrecte. InitWithContentsOfFile NSString est: assume apparemment un encodage de NSASCIIStringEncoding quand il ne peut pas déterminer l'encodage réel.

Ceci, je suis gêné de dire, peu moi aujourd'hui. J'ai eu le code suivant que j'ai été l'utiliser pour charger un fichier UTF-8 avec des caractères non-ASCII:

NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"act texts" ofType:@"txt"];
NSString *sourceData = [[NSString alloc] initWithContentsOfFile:sourcePath];

Mais les chaînes résultantes ne contiennent pas le bon caractères non-ASCII qui étaient dans le fichier; chaque fois qu'il était censé être une diacritiques ou autres non-ASCII, la chaîne contenait deux d'ordre élevé (> 128) caractères ASCII. C'est une indication que vous avez données UTF-8 étant chargé comme ASCII (UTF-16 semble encore plus étrange quand il manque de l'encodage, ce qui rend plus facile à attraper).

La solution est assez simple. Juste dire explicitement qu'il l'encodage à utiliser en appelant initWithContentsOfFile: encodage: erreur: au lieu:

NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"act texts" ofType:@"txt"];
NSString *sourceData = [[NSString alloc] initWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];


Aucun commentaire: