2013-08-19 5 views
3

Как я могу кодировать URL-адрес на стороне клиента и декодировать его на стороне сервера. Есть ли какие-либо встроенные apis для этой цели. Пожалуйста, предложите какое-либо решение. Также я хочу знать, как Могу ли я сделать процентное кодирование в C++?Encode/Decode URl In C++

+0

Вы должны указать OS/библиотеки, используемые. – Codeguard

+1

['curl_easy_escape'] (http://curl.haxx.se/libcurl/c/curl_easy_escape.html) и [' curl_easy_unescape'] (http://curl.haxx.se/libcurl/c/curl_easy_unescape.html) кажутся очевидными возможностями. –

+0

Наконец-то я узнал API для URL Encode/Decode -> UrlCanonicalize. Это оболочка api, мы можем использовать этот API для кодирования или декодирования нашего URL-адреса. См. Ниже ссылку http://msdn.microsoft.com/en-us/library/windows/desktop/bb773768(v=vs.85).aspx – Rono

ответ

2

Вы можете проверить это article и this

Encode:

std::string UriEncode(const std::string & sSrc) 
{ 
    const char DEC2HEX[16 + 1] = "ABCDEF"; 
    const unsigned char * pSrc = (const unsigned char *)sSrc.c_str(); 
    const int SRC_LEN = sSrc.length(); 
    unsigned char * const pStart = new unsigned char[SRC_LEN * 3]; 
    unsigned char * pEnd = pStart; 
    const unsigned char * const SRC_END = pSrc + SRC_LEN; 

    for (; pSrc < SRC_END; ++pSrc) 
    { 
     if (SAFE[*pSrc]) 
     *pEnd++ = *pSrc; 
     else 
     { 
     // escape this char 
     *pEnd++ = '%'; 
     *pEnd++ = DEC2HEX[*pSrc >> 4]; 
     *pEnd++ = DEC2HEX[*pSrc & 0x0F]; 
     } 
    } 

    std::string sResult((char *)pStart, (char *)pEnd); 
    delete [] pStart; 
    return sResult; 
} 

Decode:

std::string UriDecode(const std::string & sSrc) 
{ 
    // Note from RFC1630: "Sequences which start with a percent 
    // sign but are not followed by two hexadecimal characters 
    // (0-9, A-F) are reserved for future extension" 

    const unsigned char * pSrc = (const unsigned char *)sSrc.c_str(); 
    const int SRC_LEN = sSrc.length(); 
    const unsigned char * const SRC_END = pSrc + SRC_LEN; 
    // last decodable '%' 
    const unsigned char * const SRC_LAST_DEC = SRC_END - 2; 

    char * const pStart = new char[SRC_LEN]; 
    char * pEnd = pStart; 

    while (pSrc < SRC_LAST_DEC) 
    { 
     if (*pSrc == '%') 
     { 
     char dec1, dec2; 
     if (-1 != (dec1 = HEX2DEC[*(pSrc + 1)]) 
      && -1 != (dec2 = HEX2DEC[*(pSrc + 2)])) 
     { 
      *pEnd++ = (dec1 << 4) + dec2; 
      pSrc += 3; 
      continue; 
     } 
     } 

     *pEnd++ = *pSrc++; 
    } 

    // the last 2- chars 
    while (pSrc < SRC_END) 
     *pEnd++ = *pSrc++; 

    std::string sResult(pStart, pEnd); 
    delete [] pStart; 
    return sResult; 
} 
+1

Лучше - теперь немного переписывайте, чтобы избавиться от 'нового [] 'и' delete [] ', и ... –

+0

Не получил вашу точку сэра !!! Не могли бы вы объяснить более ясно ??? –

+0

Лучше использовать 'std :: string' или' std :: vector', а не использовать 'new []' и 'delete []' напрямую. Например, если исключение выбрасывается где-нибудь между 'new' и' delete', это приведет к утечке памяти. –

3

Я нашел этот implementation из dlib весьма полезным. Вам даже не нужно захватывать всю библиотеку, только эти 4 функции (unhex, hex, encode, decode). И у него есть надбавка.

0

Для кодирования:

Вы можете использовать "g_uri_escape_string()" функция, обеспечиваемая glib.h. https://developer.gnome.org/glib/stable/glib-URI-Functions.html

#include <stdio.h> 
#include <stdlib.h> 
#include <glib.h> 
int main() { 
    char *uri = "http://www.example.com?hello world"; 
    char *encoded_uri = NULL; 
    //as per wiki (https://en.wikipedia.org/wiki/Percent-encoding) 
    char *escape_char_str = "!*'();:@&=+$,/?#[]"; 
    encoded_uri = g_uri_escape_string(uri, escape_char_str, TRUE); 
    printf("[%s]\n", encoded_uri); 
    free(encoded_uri); 

    return 0; 
} 

скомпилировать его с:

gcc encoding_URI.c `pkg-config --cflags --libs glib-2.0`