// 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 |