CGI Decodage URI

Signaler
Messages postés
15
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
2 mai 2009
-
Messages postés
15
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
2 mai 2009
-
Salut a tous .
Je debute en C++ ( je viens de m y mettre pour faire un cgi ^^ ) .
En bref , j ai un formulaire qui envoie des données je les recuperes et je les affiches . Jusque la pas de probleme .
Puis , idée "bete" : que se passe t il si je tape autre chose que "toto" pour faire mon test . Je tape donc  "yéé ca marche" .
ET LA c le drame a la place de é je me retrouve un bo %E9 et a la place des espace des + donc bon je les decodes peniblement ( meme si c été tout con enfaite mais bon j ai lutté pour pas grand chose .. ) et je fini par obtenir  en gros

 if(chaine[n]=='%' && chaine[n+1]=='E')
  {
  if(chaine[n+2]=='0')  chaine[n]='à';
  if(chaine[n+2]=='2')  chaine[n]='â';
  if(chaine[n+2]=='3')  chaine[n]='ã';
  if(chaine[n+2]=='4')  chaine[n]='ä';
  if(chaine[n+2]=='8')  chaine[n]='è';
  if(chaine[n+2]=='9')  chaine[n]='é';
  if(chaine[n+2]=='A')  chaine[n]='ê';
  if(chaine[n+2]=='B')  chaine[n]='ë';
  if(chaine[n+2]=='C')  chaine[n]='ì';
  if(chaine[n+2]=='E')  chaine[n]='î';
  if(chaine[n+2]=='F')  chaine[n]='ï';
  }

et bon y a pas  a dire c'est super chiant/rebarbatif a faire .

Pour finir ( enfin ^^ mais bon j essaye d expliqué au mieu le probleme :) pour obtenir une super aide ^^) je souhaite donc savoir si il y a un moyen ( une espece de formule mathematique/ automatique ) qui sert a faire ca tout seul :p ou une fonction de string je ne c pas j ai rien trouvé ...  ( enfin si un str:decode-uri mais je c pas dans kel langage :( :s ) ..

merci d avance pour votre aide
 

5 réponses

Messages postés
15
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
2 mai 2009

bon ba j ai commencé a codé un script javascript pour voir ce que renvoie l encoder decoder URI et enfaite il ne s agit pas de ca mais d un codage escape/unescape javascript au vu des valeurs .
Je comprends pas pourquoi tous mes caracteres ne sont pas codé pareil ( les lettres normal de sont pas passé dans la fonction escape apriori etant donné que je recupere les lettre normales alors que les caracteres speciau sont passé dedans ..  bref je comprend pas tout de comment c fais mais bon xD ) .

Suite a cette decouverte de codage et de nouvelles recherches , j ai trouvé ca :

public:
static String^ UNEscape(
   String^ buffer
)

a la page  : http://www.web20tools.net/Products/Atom_Library/Help/Web20Tools.Atom~Web20Tools.Feed.Atom.Utility~UNEscape.html

Pourriez vous (en plus des autres questions ^^ ) m expliqué ce ke cela signifie et comment cela fonction :)
Merci d avance :) 

( ps c possible de faire des Edits ? j ai pas trouvé -_- )
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Salut,

j'ai coder vite fait une petite fonction dit moi si ca marche:

DWORD __stdcall Convert(BYTE* In, BYTE* Out, DWORD InSize)
{
const BYTE Table[] = {'à', 0x00, 'â', 'ã', 'ä', 0x00, 0x00, 0x00,
0x00, 'è', 'é', 'ê', 'ë', 'ì', 'î', 'ï' };
DWORD i 0, j 0, sub;
while(1)
{
if( *((WORD*) &In[i]) == 'E%' )
{
sub = (In[i+2] > 0x39) ? 0x37 : 0x30;
Out[j] = Table[ (In[i+2]-sub) ];
i+=2; j++;
}else Out[j++] = In[i];
if(i++ >= InSize) break;
}
return j; // renvoi la taille de Out
}

Neo_Fr
Messages postés
15
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
2 mai 2009

Euh , je veux bien mais j ai pas saisi comment ca marche la o_o .
moi j ai juste un string de taille quelconque qui contient un mot ou certains caractere sont passé par escape .
j ai pas BYTE* In, BYTE* Out, DWORD InSize ( je c meme pas ske c a dire vrai ... )

je debute en c++ ( a dire vrai ca ressemble presque a du c enfaite c juste pou utilisé string plutot que les char* c plus simple et il y a des ptites fonctions qui aide type string.substr et string.find ( me permet de trouvé le caractere special a echangé )
Peut tu m expliqué ta fonction pour que j essaye de l adapté ou lui donné ski fau pour qu elle fonctionne ? :) merci pour ton aide
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,

Le lien que tu as donné (web20tools.net...), c'est du dotnet.
Le dotnet est une des principales causes de décès chez les développeurs.
A éviter donc.
(Rooooh, c'est petit ça.)

La méthode de Neo_Fr prent 3 arguments :
L'adresse de la chaîne à traduire.
L'adresse de la chaîne où la traduction sera mise en place.
La taille de la chaîne à traduire.

Tu peux convertir une string à partir d'un char * avec la méthode c_str(), et récupérer la taille avec length().
Problème : c_str ne renvoie pas forcément un pointeur sur la vrai chaîne, autrement dit, modifiée ce qui est pointé par c_str() ne modifie pas forcément la string. Donc pour le buffer, c'est rappé. Faudrait passer par un char *.

Tu peux par contre essayer de réécrire la fonction de Neo_Fr en C++.

Vala ce que ça me donne :
string __stdcall Convert(string & In)
{
string Out;

const BYTE Table[] = {'à', 0x00, 'â', 'ã', 'ä', 0x00, 0x00, 0x00,
0x00, 'è', 'é', 'ê', 'ë', 'ì', 'î', 'ï' }; DWORD i 0, j 0, sub;
while(1)
{
if((i < In.length() - 2) && (*((WORD*) &In[i]) == 'E%'))
{
sub = (In[i+2] > 0x39) ? 0x37 : 0x30;
Out += Table[ (In[i+2]-sub) ];
i+=2; j++;
}else Out+= In[i];
if(i++ >= In.length()) break;
}
return Out; // renvoi la taille de Out
}
J'ai rajouté un test car si (i In.length() - 1), lorsque l'on fait le (*((WORD*) &In[i]) 'E%'), on risque de dépasser la fin de la chaîne si elle n'a pas de zéro terminal.

Réecrite comme ça, les performances en prennent probablement un coup à cause de la classe string en général et de la concaténation en particulier.
Messages postés
15
Date d'inscription
mercredi 10 octobre 2007
Statut
Membre
Dernière intervention
2 mai 2009

ah je comprend mieu comment utilisé ta fonction parce que moi  je fais avec des strings pas des char * ^^
bon par contre je capte pas trop comment ca marche le truc donc bon je vous file un bout du  truc super pete cou.....  que j ai fait .. ( optimisation : 0 ^^ ) mais bon ca marche et je comprend comment ^^

string SansPlus(string& chaine)
{


      
   
 int n;
 n=0;
 
 while(chaine[n] != '\0')
 {
  if(chaine[n]=='+')
  {
   chaine[n]=' ';
   }
  
  
  if(chaine[n]=='%' && chaine[n+1]=='A')
  {
  if(chaine[n+2]=='0')  chaine[n]=' ';
  if(chaine[n+2]=='1')  chaine[n]='¡';
  if(chaine[n+2]=='2')  chaine[n]='¢';
  if(chaine[n+2]=='3')  chaine[n]='£';
  if(chaine[n+2]=='4')  chaine[n]='¤';
  if(chaine[n+2]=='5')  chaine[n]='¥';
  if(chaine[n+2]=='6')  chaine[n]='¦';
  if(chaine[n+2]=='7')  chaine[n]='§';
....

  chaine.erase(n+1,2);
 }

n++;
}

Voila en gros le codage ( j ai fais ca avec tous les caracteres sauf les %0X X = hexadecimal ;  qui sont assez bizzare -_- ) ;