Здравствуйте, i.v.a., Вы писали:
IVA>Добрый день! Подскажите, как кодировать и декодировать URL строки в С++?
Ну, зависит от того, что требуется. Если работать только с ASCII, то там все просто получается. А вот если с unicode, тогда немного сложнее. Есть такой проект, вдруг поможет:
http://code.google.com/p/google-url/
IVA>Добрый день! Подскажите, как кодировать и декодировать URL строки в С++?
По правилам. Правила смотри в RFC, кроме того, неплохое описание есть здесь:
http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
Здравствуйте, 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");
}
}