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