2012-08-15 2 views
3

J'utilise le module std.net.curl pour obtenir du HTML à partir d'une page Web supprimée. Mais j'ai quelques problèmes avec l'encodage, que je n'ai aucune idée de comment réparer. Certaines pages, comme facebook.com je reçois les messages d'erreur suivants (temps exécuter):Séquence de codage non valide pour l'encodage 'utf-8'

[email protected]/usr/include/d/dmd/phobos/std/net/curl.d(800): Invalid encoding sequence for enconding 'utf-8' 
---------------- 
./foo(char[] std.net.curl._decodeContent!(char)._decodeContent(ubyte[], immutable(char)[])+0xf6) [0x812e6ba] 
./foo(char[] std.net.curl._basicHTTP!(char)._basicHTTP(const(char)[], const(void)[], std.net.curl.HTTP)+0x28e) [0x80f89f6] 
./foo(char[] std.net.curl.get!(std.net.curl.HTTP, char).get(const(char)[], std.net.curl.HTTP)+0x8f) [0x80f8737] 
./foo(immutable(char)[] teste.get_html(immutable(char)[])+0x112) [0x80f0806] 
./foo(_Dmain+0x5f) [0x80f06e3] 
./foo(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x14) [0x8138340] 
./foo(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x18) [0x8137e50] 
./foo(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x32) [0x8138382] 
./foo(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x18) [0x8137e50] 
./foo(main+0x94) [0x8137e04] 
/lib/libc.so.6(__libc_start_main+0xf3) [0xb7593003] 

Pour google.com, je suis (que je reçois binaire comment?)

�S��7�砱�y�����g�d��C���|��W��O�s��~����*6��@�4�&�A�J����r▒4=�FT�e�� [...] 

Pour dlang.org il fonctionne très bien.

La question est: Quelle est la bonne façon de le lire? indépendant de l'encodage de la page.

Voici mon code D:

string get_html(string page) { 
    auto client = HTTP(); 
    client.clearRequestHeaders(); 
    client.addRequestHeader("DNA", "1"); 
    client.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
    client.addRequestHeader("Accept-Encoding", "gzip, deflate"); 
    client.addRequestHeader("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"); 
    client.addRequestHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 

    return cast(string)get(page, client); 
} 

Merci à l'avance.

Répondre

4

cast(string)get(page, client) échoue pour toute séquence non UTF-8.

Utilisez les fonctions autonomes get et post, elles décodent le contenu en fonction des en-têtes envoyés du serveur et renvoient la valeur UTF-8 valide.

+0

Quelles sont ces fonctions? appelez seulement 'get (page)' au lieu de? – Jack

+0

Oui, [get] (http://dlang.org/phobos/std_net_curl.html#get), avec UFCS c'est: 'url.get()', ce qui semble plutôt cool, imo. – dav1d

+0

Mais j'ai vraiment besoin d'envoyer des en-têtes. Donc, 'get (page, client)' est vraiment nécessaire. Merci pour 'url.get()'. :) – Jack

1

Est-ce que curl supporte réellement les codages gzip et deflate, et le charset ISO-8859-1? Devriez-vous vraiment spécifier ces en-têtes vous-même, plutôt que de laisser la boucle elle-même déclarer les encodages et les charsets qu'il supporte?

Pour répondre à votre question:

La question est: Quelle est la bonne façon de le lire? indépendant de l'encodage de la page.

Vous regardez les en-têtes du serveur vous envoie, contenant la page de codage et charset, vous interprétez les données en fonction de ces en-têtes (par exemple appeler zlib à ungzip ou gonfler les données, puis traduire le HTML décompressées UTF-8).

Questions connexes