2016-12-13 3 views
1

Je dois travailler avec des chaînes contenant des codages d'URL tels que "% C3% A7", et j'ai besoin de convertir ces séquences en caractères imprimables correspondants. Par conséquent, j'ai écrit une fonction. Cela fonctionne, mais cela semble plutôt gênant. Je suis un débutant absolu en C/C++. Peut-être que quelqu'un peut me diriger vers une solution plus élégante, s'il vous plaît.Convertir le codage d'URL en caractères imprimables

#include <iostream> 

using namespace std; 

static inline void substitute_specials(string &str) { 
    const struct {string from,to;} substitutions[] { { "20"," " },{ "24","$" },{ "40","@" },{ "26","&" },{ "2C","," },{ "C3%A1","á" },{ "C3%A7","ç" },{ "C3%A9","é" } }; 
    size_t start_pos = 0; 
    while ((start_pos = str.find("%", start_pos)) != string::npos) { 
     start_pos++; 
     for (int i=0; i< extent < decltype(substitutions) > ::value; i++) { 
      if (str.compare(start_pos,substitutions[i].from.length(),substitutions[i].from) == 0) { 
        str.replace(start_pos-1, substitutions[i].from.length()+1, substitutions[i].to); 
        start_pos += substitutions[i].to.length()-1; 
       break; 
      } 
     } 
    } 
} 

int main() { 
    string testString = "This%20is %C3%A1 test %24tring %C5ith %40 lot of spe%C3%A7ial%20charact%C3%A9rs%2C %26 worth many %24%24%24"; 
    substitute_specials(testString); 
    cout << testString << "\n"; 
    return 0; 
} 

EDIT 26/12/2016: Je suis toujours coincé avec ce problème. J'ai trouvé quelques suggestions pour les bibliothèques et quelques fonctions manuscrites, mais si elles sont exécutées, elles ne décoderont que% xx (code hexadécimal de 2 octets dans la chaîne) comme% 20 = espace. Je n'en ai trouvé aucun qui ferait 4 octets de code comme% C3% 84 = Ä et je n'ai pas pu en modifier. Aussi la bibliothèque curl_easy_unescape() demande 2 codes d'octets. J'ai trouvé exactement ce dont j'ai besoin est disponible en javascript, les fonctions correspondantes sont encodeURI()/decodeURI(), voir http://www.w3schools.com/tags/ref_urlencode.asp La source C/C++ de decodeURI() résoudrait probablement mon problème. La ligne 3829 dans https://dxr.mozilla.org/mozilla-central/source/js/src/jsstr.cpp ressemble à une implémentation de cela, mais je ne peux pas extraire ce dont j'ai besoin. D'après les autres exemples que j'ai trouvés: beaucoup utilisent sscanf pour convertir un code hexadécimal à 2 octets en un int en utilisant le format% x hex, puis static_castint pour récupérer le caractère correct. Comment puis-je modifier cela pour des séquences de 4 octets? état actuel de ma fonction est

wstring url_decode2(char* SRC) { 

wstring ret; 
wchar_t ch; 
int i, ii; 
char sub[5]; 

for (i=0; i<strlen(SRC); i++) { 
    if (SRC[i]=='%') { 
     if ((SRC[i+3]=='%') && (SRC[i+1]>='A')) { 
      sub[0]=SRC[i+4]; 
      sub[1]=SRC[i+5]; // (also tried lsb/msb) 
      sub[2]=SRC[i+1]; // skip +3, it's % 
      sub[3]=SRC[i+2]; // 
      sub[4]='\0'; 
      i=i+5; 
     } else { 
      sub[0]=SRC[i+1]; 
      sub[1]=SRC[i+2]; 
      sub[2]='\0'; 
      i=i+2; 
     } 
     sscanf(&sub[0], "%x", &ii); 
     ch=static_cast<wchar_t>(ii); 
     ret+=ch; 
    } else 
     ret+=SRC[i]; 

} 
return ret; 

}

Quelqu'un peut-il me aider, s'il vous plaît?

+1

Ce sont * pas * UTF8 "encodages". Ce sont des séquences d'échappement URL (?). Ce que vous voyez dans cette page sont des caractères UTF8. Dans UTF8, les caractères ASCII apparaissent de la même manière, les caractères non-ASCII utilisent 2 octets ou plus pour stocker mais sont affichés comme un caractère. Vous avez besoin d'une méthode de décodage d'URL. –

+0

BTW [littéraux UTF8] (http://fr.cppreference.com/w/cpp/language/string_literal) nécessite le préfixe 'u8', par exemple' u8 'Δx =% "'. Ou directement à la chaîne 'auto testString = u8" Δx =% "s;' ou 'chaîne testString = u8" Δx =% "s;' –

+0

La [page MSDN sur les littéraux de chaînes et de caractères] (https://msdn.microsoft .com/fr-us/library/69ze775t.aspx) explique comment utiliser UTF8, UTF16 etc. en C++ de manière très agréable. –

Répondre