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); // пока не найдем нулевой код }