URL encoding

C++ 2012. 5. 20. 15:55




// UrlEscapeA API를 이용한 url encode

string url_encode(const string& str)

{

if (str.empty()) return "";


char temp = 0x00;

DWORD cch = -1;

HRESULT hr = S_OK;


hr = UrlEscapeA(str.c_str(), &temp, &cch, URL_ESCAPE_SEGMENT_ONLY | URL_ESCAPE_PERCENT);

if (cch == 0 && FAILED(hr)) 

{

// 인코딩 길이 구하기 실패

return "";

}


cch++; // 끝 공백문자 포함한 길이 추가


vector<char> en_str(cch, 0x00);

hr = UrlEscapeA(str.c_str(), &en_str.at(0), &cch, URL_ESCAPE_SEGMENT_ONLY | URL_ESCAPE_PERCENT);

if (FAILED(hr)) 

{

// 인코딩 실패

return "";

}


string result(&en_str.at(0), &en_str.at(0) + cch);


// '+' 문자는 API를 이용한 인코딩이 불가하여 직접 수행함.

result = replace_all(result, "+", "%2B");

//result = replace_all(result, "=", "%3D"); // 혹시나 하는 맘에 넣었으나 필요 없음

return result;

}


// UrlUnescapeA API를 이용한 url decode

string url_decode(const string& str)

{

if (str.empty()) return "";


char temp = 0x00;

DWORD cch = -1;

HRESULT hr = S_OK;


vector<char> en_str(str.begin(), str.end());

en_str.push_back(0x00); // 끝 공백문자


hr = UrlUnescapeA(&en_str.at(0), &temp, &cch, URL_UNESCAPE | URL_ESCAPE_UNSAFE);

if (cch == 0 && FAILED(hr)) 

{

// 길이 구하기 실패

return "";

}


vector<char> de_str(cch, 0x00);

hr = UrlUnescapeA(&en_str.at(0), &de_str.at(0), &cch, URL_UNESCAPE | URL_ESCAPE_UNSAFE);

if (FAILED(hr)) 

{

// 디코딩 실패

return "";

}


return string(&de_str.at(0), &de_str.at(0) + cch);

}


'C++' 카테고리의 다른 글

ActiveX에서 exe 호출시 주의할 점  (0) 2012.05.20
c++ 프로그램에서 web html과 통신  (0) 2012.05.20
log4cxx 코딩으로 로거 생성 샘플  (0) 2012.05.20
C#의 tick 으로 변환  (0) 2012.05.20
endian 변환민 serialize  (0) 2012.05.20
암호화 : RSA, AES, BASE64  (0) 2012.05.20
간단한 sync 소켓 사용  (0) 2012.05.20
WinINet, WinHTTP, post 전송  (0) 2012.05.20