кодирование и декодирование URL строки в С++
От: i.v.a.  
Дата: 02.09.09 05:56
Оценка:
Добрый день! Подскажите, как кодировать и декодировать URL строки в С++?
Re: кодирование и декодирование URL строки в С++
От: SergH Россия  
Дата: 02.09.09 06:27
Оценка:
Здравствуйте, i.v.a., Вы писали:

IVA>Добрый день! Подскажите, как кодировать и декодировать URL строки в С++?


Откуда куда?
И в чём именно сложность: ты не знаешь правила или не понимаешь, как их выполнить?
Делай что должно, и будь что будет
Re: кодирование и декодирование URL строки в С++
От: uhh  
Дата: 02.09.09 09:59
Оценка:
Здравствуйте, i.v.a., Вы писали:

IVA>Добрый день! Подскажите, как кодировать и декодировать URL строки в С++?


Ну, зависит от того, что требуется. Если работать только с ASCII, то там все просто получается. А вот если с unicode, тогда немного сложнее. Есть такой проект, вдруг поможет:

http://code.google.com/p/google-url/
Re: кодирование и декодирование URL строки в С++
От: Vamp Россия  
Дата: 02.09.09 14:00
Оценка:
IVA>Добрый день! Подскажите, как кодировать и декодировать URL строки в С++?
По правилам. Правила смотри в RFC, кроме того, неплохое описание есть здесь: http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
Да здравствует мыло душистое и веревка пушистая.
Re: кодирование и декодирование URL строки в С++
От: RonWilson Россия  
Дата: 02.09.09 20:15
Оценка:
Здравствуйте, i.v.a., Вы писали:

IVA>Добрый день! Подскажите, как кодировать и декодировать URL строки в С++?


хедер
#ifndef _URL_H_
#define _URL_H_

#include <string>

typedef std::basic_string<TCHAR> unistring;

class URLEncoder 
{
public:
    static unistring encode(unistring str);
private:
    static bool isOrdinaryChar(TCHAR c);
};

class URLDecoder 
{
public:
    static unistring decode(unistring str);
private:
    static int convertToDec(const char* hex);
    static void getAsDec(char* hex);
};

#endif // _URL_H_


цпп

#include "stdafx.h"
#include "url.h"
#include <tchar.h>
#include <string>
#include <vector>

unistring URLEncoder::encode(unistring str) 
{
    size_t len = str.length();
    char* buff = new char[len + 1];

    #ifdef UNICODE
    buff[ 0 ] = 0;
    wcstombs( buff, str.c_str(), len );
    buff[ len ] = 0;
    #else
    _tcscpy(buff,str.c_str());
    #endif

    std::basic_string<char> ret = "";
    for(size_t i=0;i<len;i++) {
        if(isOrdinaryChar(buff[i])) {
            ret = ret + buff[i];
        }else if(buff[i] == ' ') {
            ret = ret + "+";
        }else {
            char tmp[6];
            BYTE b = (BYTE)(buff[i]);
            sprintf(tmp, "%%%x", b );
            ret = ret + tmp;
        }
    }
    delete[] buff;

    #ifdef UNICODE
    size_t length = ret.length();
    TCHAR *result = new TCHAR[ length + 1];
    result[ 0 ] = 0;
    mbstowcs( result, ret.c_str(), length );
    result[ length ] = 0;
    unistring tresult = unistring( result );
    delete [] result;
    return tresult;
    #else
    return ret;
    #endif
}

bool URLEncoder::isOrdinaryChar(TCHAR c) {
#ifdef UNICODE
    TCHAR ch = towlower(c);
#else
    int ch = tolower(c);
#endif
    if(ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd' || ch == 'e' 
        || ch == 'f' || ch == 'g' || ch == 'h' || ch == 'i' || ch == 'j' 
        || ch == 'k' || ch == 'l' || ch == 'm' || ch == 'n' || ch == 'o' 
        || ch == 'p' || ch == 'q' || ch == 'r' || ch == 's' || ch == 't' 
        || ch == 'u' || ch == 'v' || ch == 'w' || ch == 'x' || ch == 'y' 
        || ch == 'z' || ch == '0' || ch == '1' || ch == '2' || ch == '3' 
        || ch == '4' || ch == '5' || ch == '6' || ch == '7' || ch == '8' 
        || ch == '9') {
        return true;
    }
    return false;
}

unistring URLDecoder::decode(unistring str) {
    size_t len = str.length();
    char* buff = new char[len + 1];

    #ifdef UNICODE
    buff[ 0 ] = 0;
    wcstombs( buff, str.c_str(), len );
    buff[ len ] = 0;
    #else
    _tcscpy(buff,str.c_str());
    #endif

    std::basic_string<char> ret = "";
    for(size_t i=0;i<len;i++) {
        if(buff[i] == '+') {
            ret = ret + " ";
        }else if(buff[i] == '%') {
            char tmp[4];
            char hex[4];
            hex[0] = buff[++i];
            hex[1] = buff[++i];
            hex[2] = '\0';        
            sprintf(tmp, "%c", convertToDec(hex));
            ret = ret + tmp;
        }else {
            ret = ret + buff[i];
        }
    }
    delete[] buff;

    #ifdef UNICODE
    size_t length = ret.length();
    TCHAR *result = new TCHAR[ length + 1];
    result[ 0 ] = 0;
    mbstowcs( result, ret.c_str(), length );
    result[ length ] = 0;
    unistring tresult = unistring( result );
    delete [] result;
    return tresult;
    #else
    return ret;
    #endif
}

int URLDecoder::convertToDec(const char* hex) {
    char buff[12];
    sprintf(buff, "%s", hex);
    int ret = 0;
    size_t len = strlen(buff);
    for(size_t i=0;i<len;i++) {
        char tmp[4];
        tmp[0] = buff[i];
        tmp[1] = '\0';
        getAsDec(tmp);
        int tmp_i = atoi(tmp);
        int rs = 1;
        for(size_t j=i;j<(len-1);j++) {
            rs *= 16;
        }
        ret += (rs * tmp_i);
    }
    return ret;
}

void URLDecoder::getAsDec(char* hex) {
    int tmp = tolower(hex[0]);
    if(tmp == 'a') {
        strcpy(hex, "10");
    }else if(tmp == 'b') {
        strcpy(hex, "11");
    }else if(tmp == 'c') {
        strcpy(hex, "12");
    }else if(tmp == 'd') {
        strcpy(hex, "13");
    }else if(tmp == 'e') {
        strcpy(hex, "14");
    }else if(tmp == 'f') {
        strcpy(hex, "15");
    }else if(tmp == 'g') {
        strcpy(hex, "16");
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.