Ответы пользователя по тегу C++
  • Аналог UrlEncode (или его реализаию) для C++?

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

    Ответ написан
    3 комментария