Задать вопрос

Аналог UrlEncode (или его реализаию) для C++?

Нужно конвертировать строку в escape-последовательность, подскажите пожалуйста реализацию на C++ (CLR/CLI).

В MSDN нашёл UrlEncode (msdn.microsoft.com/ru-ru/library/system.web.httpse... но никак не получается заставить работать.


Спасибо.
  • Вопрос задан
  • 8033 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Methos
@Methos
Нашёл в закромах. На преобразование типов строк не обращайте внимание, используйте свою.
Использовалось при написании поисковика, было дело =)

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

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BrainHacker
Попробуйте использовать функцию InternetCanonicalizeUrl:
msdn.microsoft.com/en-us/library/windows/desktop/aa384342%28v=vs.85%29.aspx
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы