begin process at 2012 02 12 01:02:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

Url encoding


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Url encoding

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ée 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 = éliminer les doublons ! [ par jekburn ] Bonsoir, J'ai demandé de l'aide y'a 2 semaines, mais là je suis toujours bloqué ! Please help ! Je cherche à supprimer les doublons que me sort mon p


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales