O
O
ozver2012-10-21 16:54:13
C++ / C#
ozver, 2012-10-21 16:54:13

UrlEncode analog (or its implementation) for C++?

I need to convert a string to an escape sequence, please tell me the implementation in C++ (CLR/CLI).
I found UrlEncode in MSDN ( msdn.microsoft.com/ru-ru/library/system.web.httpse... but I can't get it to work.
Thank you.

Answer the question

In order to leave comments, you need to log in

2 answer(s)
E
Eugene, 2012-10-21
@ozver

Found in the bins. Don't pay attention to string type conversion, use your own.
Used when writing a search engine, it was the case =)

urlencode & urldecode
wstring urlencode(const string &c) {
    
    string escaped="";
    int max = c.length();
    for(int i=0; i<max; i++)
    {
        if ( (48 <= c[i] && c[i] <= 57) ||//0-9
             (65 <= c[i] && c[i] <= 90) ||//abc...xyz
             (97 <= c[i] && c[i] <= 122) || //ABC...XYZ
             (c[i]=='~' || c[i]=='!' || c[i]=='*' || c[i]=='(' || c[i]==')' || c[i]=='\'')
        )
        {
            escaped.append( &c[i], 1);
        }
        else
        {
            escaped.append("%");
            escaped.append( char2hex(c[i]) );//converts char 255 to string "ff"
        }
    }
    
    wstring escaped_w = L"";

    wchar_t w[1024];
    mbstowcs((wchar_t*)&w, escaped.c_str(), 1024);

    escaped_w = wstring(w);

    return escaped_w;
}

// Функция URL-декодирования.
// Функция преобразует строку данных st в нормальное представление.
// Результат помещается в ту же строку, что была передана в параметрах.
void urldecode(char *st) {
  char *p=st;  // указывает на текущий символ строки
  char hex[3]; // временный буфер для хранения %XX
  int code;    // преобразованный код
  // запускаем цикл, пока не кончится строка (то есть, пока не
  // появится символ с кодом 0, см. ниже)
  do {
    // Если это %-код ...
    if(*st == '%') { // тогда копируем его во временный буфер
      hex[0]=*(++st); hex[1]=*(++st); hex[2]=0;
      // переводим его в число
      sscanf(hex,"%X",&code);
      // и записываем обратно в строку
      *p++=(char)code;
      // указатель p всегда отмечает то место в строке, в которое
      // будет помещен очередной декодированный символ
    }
    // иначе, если это "+", то заменяем его на " "
    else if(*st=='+') *p++=' '; 
    // а если не то, ни другое - оставляем как есть
    else *p++=*st; 
  } while(*st++!=0); // пока не найдем нулевой код
}

B
BrainHacker, 2012-10-21
@BrainHacker

Try using the InternetCanonicalizeUrl function:
msdn.microsoft.com/en-us/library/windows/desktop/aa384342%28v=vs.85%29.aspx

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question