Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Url encoding [ Windows / Réseau & Internet ] (Lestat_2070)

dimanche 4 mars 2007 à 12:19:46 | Url encoding

Lestat_2070

Membre Club
Bonjour à tous,
Tout d'abord, j'espère que je ne me trompes pas de section, pour ce sujet. Ensuite, j'essaye de faire une fonction comparable à la fonction php urlencode(), mais j'ai un peu de mal . Pour ceux qui ne sauraient pas son utilité, voir son utilité [ Lien ].
Donc, mon code en C se présente comme celà:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
    int i=0;
    int len=strlen("ïÍ)kÆu");
    char* final=new char[len];
    memcpy(final, "ïÍ)kÆu", (len+1));
    while(i != len)
    {
        printf("%%%X",(char)final[i++] & 0xFF);
    }
    printf("\n");
    system("pause");
    return 0;
}

Ma fonction en C affiche: %EF%CD%29%6B%C6%75, où PHP affiche: %EF%CD%29k%C6u. Que dois- je changer afin de mieux encoder mes caractères, comme PHP le fait ?
Merci d'avance .

dimanche 4 mars 2007 à 12:33:19 | Re : Url encoding

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
J'imagine qu'il te faut une table qui te dira si un char donné doit être transformé (par exemple 'Æ') ou pas (par exemple 'k')
Un truc du style
int transform[] = {0, 0, 1, 0, ...} // Tableau de 256 entiers

et après
while(i != len)
{
  char c = final[i++];
  if(transform[i]) printf("%%%X", c);
  else printf(c);
}

Sinon:
char* final=new char[len + 1];

_____________________________________
Un éditeur de ressources gratuit pour Windows


dimanche 4 mars 2007 à 12:33:51 | Re : Url encoding

vecchio56

Administrateur CodeS-SourceS
Pardon: if(transform[c])

_____________________________________
Un éditeur de ressources gratuit pour Windows


dimanche 4 mars 2007 à 14:21:24 | Re : Url encoding

Lestat_2070

Membre Club
Bonjour vecchio56, et merci pour ta réponse rapide .
J'ai commencé à créer le tableau nommé transform, c'est un peu long et délicat, mais j'aime bien ton idée . Pour savoir quels caractères je dois encoder (et surtout par flemme (désolé ), j'ai fait un simple script en PHP:
<?php
for ($i=0;$i < 256;$i++) {
        if (urlencode(chr($i)) == chr($i))
            echo '0',',';
        else echo '1',',';
?>

Ce qui m'a donné les valeurs à mettre dans mon tableau d'entiers, nommé transform. Mon programme me donne donc au final: %EF%CD%29k%C6u, ce qui correspond bien à ce que je voulais. Ton idée est vraiment géniale, c'est magnifique, merci !

dimanche 4 mars 2007 à 21:55:54 | Re : Url encoding

Cphil51

sinon tu vérifie si chaque caractère de ta chaine est dans une chaine validChars (plus léger) :

#include <stdio.h>
#include <string.h>

void URLencode(char * str)
{
  char * s = str;
  char * validChars = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz:/.?=_-$(){}~&";
  char * isValidChar;

  do
  {
    isValidChar = strchr(validChars, *str);
    if(!isValidChar)
    {
        printf("%%%2X", *str);
    }
    else
    {
        printf("%c", *str);
    }
  }while(*++str);
  str = s;
}



int main()
{
    URLencode("while(*str++)sqfqsfq  ///\\ ");
}

Au lieu de faire un printf tu peut ajouter a un buffer...

dimanche 4 mars 2007 à 23:47:25 | Re : Url encoding

vecchio56

Administrateur CodeS-SourceS
Plus léger?? Non sérieusement ta solution est très mauvaise en performance (un strchr pour chaque caractère dans ta solution, contre un simple accès indexé pour moi)

_____________________________________
Un éditeur de ressources gratuit pour Windows


lundi 5 mars 2007 à 00:05:27 | Re : Url encoding

Lestat_2070

Membre Club
@Cphil51, et merci pour ta contribution
Je ne connaissait pas isValidChar, c'est bien partique quand même. Ta fonction n'est pas mal, merci

lundi 5 mars 2007 à 08:16:39 | Re : Url encoding

vecchio56

Administrateur CodeS-SourceS
"Je ne connaissait pas isValidChar"

isValidChar c'est juste le nom de sa variable

_____________________________________
Un éditeur de ressources gratuit pour Windows


lundi 5 mars 2007 à 09:17:13 | Re : Url encoding

Cphil51

C'est vrai que c'est plus lourd xD. Après reflexion... Mais le code généré devrais quand méme être un poil plus petit. Le strchr peut être substitué par une fonction "maison" faite que pour ca. Donc plus rapide ; mais après ca devrais ressembler un peut à ta solution.
Il est quand même nécessaire de privilégier le plus rapide, donc ta solution dans l'immédiat.
 
En ce moment je travail sur un projet qui demande des accès HTTP, je retravaillerais donc surement sur mon encodeur en terme d'optimisation.

lundi 5 mars 2007 à 10:17:31 | Re : Url encoding

Cphil51

Bon. Voila le travail... Normalement c'est TRES rapide maintenant :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * url_encode(const unsigned char * str)
{
  unsigned char * s = str;
  unsigned char * t = NULL;
  unsigned char * ret;
  unsigned char isValidChar[] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //16
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //32
    0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, //48
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, //64
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //80
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, //96
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, //112
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, //128
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // >128
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  };

  int lenght = 0;

  // calcul de la taille de la chaine urlEncodée
  do{
    if(!isValidChar[*s])
        lenght+=3; // %xx : 3 caractères
    else
        lenght++;  // sinon un seul
  }while(*++s); // avance d'un cran dans la chaine. Si on est pas à la fin, on continue...

  s = str;
  t = (char *)malloc(sizeof(unsigned char) * (lenght + 1)); // Allocation à la bonne taille
  if(!t) exit(EXIT_FAILURE);
  ret = t;

  //encodage
  do{
    if(!isValidChar[*s])
        sprintf(t, "%%%2X", *s), t+=3;
    else
        sprintf(t, "%c", *s), t++;
  }while(*++s);

  *t = 0; // 0 final
  return ret;
}

int main()
{
    unsigned char * urlEncoded = url_encode("C:\\Program Files\\Documents web\\index.html");
    printf("%s", urlEncoded);
    free(urlEncoded);
}

@+


1 2

Cette discussion est classé dans : int, php, include, char, len


Répondre à ce message

Sujets en rapport avec ce message

Dans le genre prenant........ [ par Xs ] oui !c 'est trés chiant !j'explique mon pb : j'ai un code source, fais par moi-meme, et dedans, je veux que l'on saisisse des renseignement comme le l pb error C2011 par pitié aidé moi [ par neonmix ] Voici mon prog:c'est un garage ki possède des voitures, ces voitures peuvent être "de course" ou "de série" (classe mere voiture, classe fille voiture problème de char [ par minet03 ] Coucoutout le monde, tout d'abord voilà mon code :#include #include #include #include #include #include char *bin_dec(char *binai Prob avec les sockets [ par Sload ] Bonjour à tous ! Voila mon probleme , j'essaye de develloper un logiciel client/serveur. Je n'en suis qu'au tout début et j'ai déja un probleme lol ! oh non!! [ par bako25 ] Le prog suivant  calcule le nombre des 'e' dans un paragraphe: #include #include< Prob avec les variables [ par Ilsundal ] Bonjour a tous,voila mon probleme, j'ai declaré une variable, mais quand je lui assigne par exemple  : MAISON, il m'affiche que M. comment faire pour Texte2Hexa [ par Matt67 ] Bonjour,Je voudrais savoir si on pouvait optimiser ceci :#include #include int main(){    static char *conv[] = {"00 ", "01 ", "02 ", "03 ", "04 ", "0 plus court chement avec le cout [ par developvbdebut ] Bonsoir tout le mondeJ'ai un probleme avec l'algo du plus cours chemin, je ne vois pas comment mis prendre. De plus, je dois affichier la distance e Fonction substr en C [ par julien_boss ] Bonjour,j'ai codé cette fonction, sensée être l'équivalent de string::substr(...) en C :char * StrSub(const char *s, int pos, int len){    char *ps = [dev c++] mot de passe c++ [ par kiki67100 ] Bonjour jaimerais savoir comment faire une petit gestion de mot de passe en c++ voici mon codes mais meme avec un faux mot de passe sa marche /*** PRO


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.