2010-11-17 31 views
1

La méthode initWithContentsOfURL:usedEncoding:error: détectera automatiquement le bon encodage de chaîne pour décoder les données de l'URL spécifiée. Cependant, cette méthode est synchrone et j'essaie d'effectuer la même tâche de manière asynchrone en utilisant un NSURLConnection. Le problème que j'ai est que quand je reçois le NSData de l'URL, il n'y a aucune méthode pour convertir facilement ces données dans un NSString sans connaître l'encodage. Comme je tire des documents HTML les URL pourraient être n'importe quel site Web sur Internet, et les encodages seront toutes sortes de choses.L'équivalent asynchrone de l'attribut -initWithContentsOfURL: usedEncoding de NSString: error:

Existe-t-il un moyen de découvrir l'encodage, pour effectuer exactement ce que fait initWithContentsOfURL:usedEncoding:error:?

+0

Impossible de stocker le NSData que vous chargez de manière asynchrone sur le disque et de l'ouvrir avec un fichier: // URL? Pas essayé cependant ... – Eiko

Répondre

0

Si vous programmez pour le bureau, vous pouvez lier dans les services principaux et utiliser le renifleur fourni par le gestionnaire de conversion de codage de texte; Voir TECCreateSniffer() et les fonctions d'accompagnement. Si vous ciblez iOS, vous devrez soit charger les données de manière asynchrone, les écrire dans un fichier de manière asynchrone, puis utiliser de manière synchrone la méthode NSString mentionnée, ou essayer de renifler vous-même l'encodage à l'aide de l'heuristique que vous pouvez créer ou pillage.

2

Voici comment votre méthode connection:didReceiveResponse: délégué ressemblerait à ceci:

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSStringEncoding nsEncoding = 0; 
    NSString *textEncodingName = [response textEncodingName]; 
    if (textEncodingName) 
    { 
     CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)textEncodingName); 
     if (cfEncoding != kCFStringEncodingInvalidId) 
     { 
      nsEncoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding); 
     } 
    } 

    if (nsEncoding != 0) 
    { 
     // Great, you have your encoding 
    } 
    else 
    { 
     // You are on your own, you have to apply a heuristic 
    } 
} 

Aussi, je vous suggère de lire Friday Q&A 2010-02-19: Character Encodings par Mike Ash.