2011-03-22 7 views
0

J'essaie d'afficher du texte japonais sur le simulateur ios et un ipod touch. Le texte est lu à partir d'un fichier XML. L'en-tête est:objectif c - ne lit pas le fichier encodé utf-8

<?xml version="1.0" encoding="utf-8"?> 

Lorsque le texte est en anglais, il s'affiche très bien. Cependant, lorsque le texte est japonais, il apparaît comme un méli-mélo inintelligible de caractères à un octet.

J'ai essayé d'enregistrer le fichier spécifiquement comme unicode en utilisant TextEdit. J'utilise NSXMLParser pour analyser les données. Toutes les idées seraient très appréciées.

Voici le code d'analyse syntaxique

// Override point for customization after application launch. 

    NSString *xmlFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"questionsutf8.xml"]; 
    NSString *xmlFileContents = [NSString stringWithContentsOfFile:xmlFilePath]; 

    NSData *data = [NSData dataWithBytes:[xmlFileContents UTF8String] length:[xmlFileContents lengthOfBytesUsingEncoding: NSUTF8StringEncoding]];     

    XMLReader *xmlReader = [[XMLReader alloc] init]; 

    [xmlReader parseXMLData: data]; 
+0

Pouvez-vous poster le code que vous utilisez pour charger le fichier dans le 'NSXMLParser'? –

+0

Vous pouvez remplacer votre utilisation du 'stringWithContentsOfFile:' avec 'stringWithContentsOfFile: encoding: error:' obsolète. Votre fichier n'a peut-être pas de nomenclature indiquant qu'il s'agit en fait d'UTF-8. – imaginaryboy

+0

Oui, une nomenclature est facultative pour UTF-8. Mais s'il n'y en a pas, stringWithContentsOfFile: ne peut pas le chercher pour déterminer si le contenu d'un fichier est UTF-8 ou un autre encodage 8 bits, tel que ISO-8859- *. Utilisation de dataWithContentsOfFile: évite cette difficulté car NSData ne sait pas ou ne se soucie pas de l'encodage - c'est juste un sac d'octets - et NSXMLParser comprend l'attribut "encoding" dans le préfixe . –

Répondre

1

D'abord, vous devez vérifier avec TextWrangler (gratuit à partir de l'App Store Mac ou barebones.com) que votre fichier XML est vraiment codage UTF-8. Ensuite, essayez de créer xmlFileContents avec + stringWithContentsOfFile: encoding: error:, spécifiant explicitement le codage UTF-8. Ou, mieux encore, contournez entièrement la chaîne intermédiaire et créez des données avec + dataWithContentsOfFile :.

+0

Nice. Je venais de trouver le stringWithContentsOfFile, et cela a fonctionné. –

2

stringWithContentsOfFile: est une méthode obsolète. Il n'effectue pas de détection d'encodage sauf si le fichier contient la marque d'ordre d'octet appropriée, sinon il interprète le fichier comme l'encodage de chaîne C par défaut (l'encodage renvoyé par la méthode +defaultCStringEncoding). Au lieu de cela, vous devez utiliser la méthode non-obsolète [and encoding-detection] stringWithContentsOfFile:usedEncoding:error:.

Vous pouvez l'utiliser comme ceci:

NSStringEncoding enc; 
NSError *error; 
NSString *xmlFileContents = [NSString stringWithContentsOfFile:xmlFilePath 
                usedEncoding:&enc 
                 error:&error]; 

if (xmlFileContents == nil) 
{ 
    NSLog (@"%@", error); 
    return; 
} 
Questions connexes