Как я могу кодировать URL-адрес на стороне клиента и декодировать его на стороне сервера. Есть ли какие-либо встроенные apis для этой цели. Пожалуйста, предложите какое-либо решение. Также я хочу знать, как Могу ли я сделать процентное кодирование в C++?Encode/Decode URl In C++
ответ
Вы можете проверить это 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;
}
Лучше - теперь немного переписывайте, чтобы избавиться от 'нового [] 'и' delete [] ', и ... –
Не получил вашу точку сэра !!! Не могли бы вы объяснить более ясно ??? –
Лучше использовать 'std :: string' или' std :: vector', а не использовать 'new []' и 'delete []' напрямую. Например, если исключение выбрасывается где-нибудь между 'new' и' delete', это приведет к утечке памяти. –
Я нашел этот implementation из dlib весьма полезным. Вам даже не нужно захватывать всю библиотеку, только эти 4 функции (unhex, hex, encode, decode). И у него есть надбавка.
Для кодирования:
Вы можете использовать "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`
Вы должны указать OS/библиотеки, используемые. – Codeguard
['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) кажутся очевидными возможностями. –
Наконец-то я узнал API для URL Encode/Decode -> UrlCanonicalize. Это оболочка api, мы можем использовать этот API для кодирования или декодирования нашего URL-адреса. См. Ниже ссылку http://msdn.microsoft.com/en-us/library/windows/desktop/bb773768(v=vs.85).aspx – Rono