Winsock et les accents...

fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008 - 29 oct. 2007 à 14:08
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 30 oct. 2007 à 16:11
Salut a tous,

Voila j'ai realisé un projet, celui-ci consiste à récupérer une chaine de caracteres provenant d'une servlet distante.
Bon jusque là rien de bien méchant, mes requetes HTTP fonctionne, je recupere bien ma chaine de caractere, me permettant de générer des écrans par la suite.
Mon souci est le suivant : cette chaine de caractères est fournie par un fichier txt. Ma servlet va simplement lire ce fichier, et lorsque j'appelle la requete, cela me renvoi bien le contenu. Or, si des accents sont présents, alors la requete la remplace par le signe "?".
y-aurait-il quelque chose a preciser dans la création de ma requete? J'ai essayé Accept-Charset mais ca n'a pas l'air de passer...

Voici la création de ma requete ( je preciese que je code en C en Win32 pour Windows CE) :
    strcpy(canal,"GET ");                                    // creation de la requete HTTP, methode GET
    strcat(canal,chemin);                            // chemin du fichier, genre "/ecran.txt"
    strcat(canal," HTTP/1.1\r\nHost: ");                    // type HTTP, suivi de l'adresse Host
    strcat(canal,adresseIpFichierIni);                        // adresse IP
    strcat(canal,"\r\n\r\n");                                // deux retour chariot
    memset(&sin, 0, sizeof(sin));

    sin.sin_addr.s_addr = inet_addr(adresseIp);    // adresse IP a laquelle se connecter
    sin.sin_family = AF_INET;
    sin.sin_port = htons(atoi(portFichierIni));                // port HTTP.

    connect(sock, (SOCKADDR *)&sin, sizeof(sin)                        // on se connecte sur le serveur.
    send(sock, canal, strlen(canal), 0);            // on envoie la requête HTTP.
    recv(sock, cBuffligne, sizeof(cBuffligne), 0);    // reception des donnees dans le buffer

Et donc , si en entré le fichier texte contient "Salut à cépépéfrance.com", mon buffer me renvoi "Salut ? c?c?c?france.com.

Je précise que je ne voudrais pas avoir à modifier le fichier texte en entrée...
Merci!

4 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 oct. 2007 à 15:45
Salut,

Le probleme ne vient ni de winsock ni du protocol http, mais du fait que tu n'a pas encodé l'url.

Une url ne doit en théorie contenir que des caracteres ascii, et donc
cépépéfrance.com deviendrait un truc de ce genre:
c%C3%A9p%C3%A9p%C3%A9france.com.
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
29 oct. 2007 à 16:09
Euh je ne comprends pas trop aardman, excuse moi...
Mon fichier texte, je suis obligé de lui fournir avec les accents, sinon si dès le départ je mets "c%C3%A9p%C3%A9p%C3%A9france.com", alors dans le buffer je récupère exactement la même chose, à savoir "c%C3%A9p%C3%A9p%C3%A9france.com"...

De plus, je ne pense pas que ce soit dans l'url, puisque moi je créé une requete " a la main" ne contenant aucun accent, mais c'est seulement ce que je récupère qui en contient, et qui parait mal passer dans l'HTTP...

Je ne sais pas si j'ai été clair.
en fin je résume : du coté serveur j'ai un fichier contenant "cépépé". Du coté client j'emet une requete, qui appelle une servlet et lit le contenu du fichier. Ce contenu m'est renvoyé, mais quelque chose dans le tuyau fait que les é sont remplacés par des "?"
Donc j'ai pensé moi aussi à forcer avec des "%C3%A9", mais cela ne fonctionne pas mieux...
Une autre idée?
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
30 oct. 2007 à 08:41
Re salut,

Je bloque toujours sur le probleme, et j'ai cherché du coté de l'encodage? puis-je forcer un encodage coté client lorsque je lance ma requete?
Voici la requete POST que j'utilise par ailleurs, celle ci ne m'autorise pas mieux les accents :
strcpy(canal,"POST ");                                        // methode employee
    strcat(canal,cheminFichierIni);
    strcat(canal,"?");
    strcat(canal," HTTP/1.1\r\nHost: ");                        // chemin de la servlet
    strcat(canal,adresseIpFichierIni);                // adresse du serveur   
    strcat(canal,"\r\nConnection: Close\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ");
    strcat(canal, ConvertUnicodeToAnsi(chaineLength));            // longueur chaine renvoyee (content-length)
    strcat(canal,"\r\n\r\n");                                                // deux retours chariots
    strcat(canal,chainePostee);                                        // la chaine a renvoyer
    strcat(canal,"\r\n\r\n");   

Je fais un send puis un recv. Dois-je mettre un autre Content-Type? ou est-ce que la modification dois intervenir côté serveur? à la lecture du fichier?
Merci d'avance, là je ne vois pas...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
30 oct. 2007 à 16:11
Salut,

J'avais pas compris que c'etait dans le contenu de ta requete.

L'encodage c'est toi qui le gere, il n'y a pas moyen de 'forcer' quoi
que ce soit, il faudrait surtout savoir comment ton fichier est encodé
(iso 8859-1, utf-8..).

Pour que le serveur décode bien ton texte, tu pourrait peut etre mettre
un content-type: text/plain; charset="..."; avec le charset qui va bien.
0
Rejoignez-nous