본문 바로가기

Native/C++

percent encode

[code]
/**
* @file CPercentEncode.h
* @author cheol-dong choi <aucd29@gmail.com>
* @version 1.0
* @date June 17, 2010 18:3:17
* @section LICENSE
*
* @section DESCRIPTION
* <b>sample code</b>
* @code
*        CPercentEncode percent;
*        percent.Encode("가나다라abcd");
* @encode
*
* @section CHANGE_LOG
* - doxygen style 로 주석 변경 2010-08-20 (16:36:19)
*/


#ifndef __CD_CPERCENTENCODE_H__
#define __CD_CPERCENTENCODE_H__


#include <string>


/**
* @class CPercentEncode
* @brief 문자열을 percent encoding 시킨다.
*/
class CPercentEncode
{
public:

    /*
     * Construction
     */
    CPercentEncode();

    /*
     * Destructor
     */
    virtual ~CPercentEncode();

public:

    /*
     * Getter methods
     */
    std::string Encode(std::string szData);

    std::string EncodeUTF8(std::string szData);

    void SetContentType(bool bContentType);

protected:

    /*
     * Internal methods
     */

protected:

    /*
     * Attributes
     */
    bool _bContentType;
};

#endif
[/code]


[code]
/**
* @file CPercentEncode.cpp
* @author cheol-dong choi <aucd29@gmail.com>
* @version 1.0
* @date June 17, 2010 18:3:20
* @section LICENSE
*
*
* @section DESCRIPTION
* @see http://en.wikipedia.org/wiki/Percent-encoding
*
*    - Characters in the unreserved character set as defined by
*     [RFC3986], Section 2.3 (ALPHA, DIGIT, '-', '.', '_', '~')
*     MUST NOT be encoded.
*
*    - All other characters MUST be encoded
*
*    - The two hexadecimal characters used to represent encoded
*     characters MUST be uppercase
*
*
* @see http://ko.wikipedia.org/wiki/ISO/IEC_8859
*
* @section CHANGE_LOG
* - doxygen style 로 주석 변경 2010-08-20 (16:37:01)
*
*/


#include "CPercentEncode.h"
#include "RSLOGGER.H"
#include "CConvertor.h"


/*
* CPercentEncode
*/
CPercentEncode::CPercentEncode()
    : _bContentType(false)
{

}


/*
* ~CPercentEncode
*/
CPercentEncode::~CPercentEncode()
{

}


/**
* 문자열을 percent encoding(url encoding) 한다.
*
* @param szData 변경할 문자열
* @return 변경된 문자열
*/
std::string CPercentEncode::Encode(std::string szData)
{
    LOG1("CPercentEncode::Encode\n");

    if (!szData.size())
    {
        return "";
    }

    int nToNumber;
    char szEncodedChar[4] = {0};
    std::string szEncodedData;

    for (size_t i=0; i<szData.size(); ++i)
    {
        switch(szData[i])
        {
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':                //    [DIGIT]

        case 'a': case 'b': case 'c': case 'd': case 'e':
        case 'f': case 'g': case 'h': case 'i': case 'j':
        case 'k': case 'l': case 'm': case 'n': case 'o':
        case 'p': case 'q': case 'r': case 's': case 't':
        case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':

        case 'A': case 'B': case 'C': case 'D': case 'E':
        case 'F': case 'G': case 'H': case 'I': case 'J':
        case 'K': case 'L': case 'M': case 'N': case 'O':
        case 'P': case 'Q': case 'R': case 'S': case 'T':
        case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z':        // [ALPHA]

        case '_': case '~': case '.': case '-':    
            szEncodedData += szData[i];
            break;

        case ' ':
            if (_bContentType) // The application/x-www-form-urlencoded type
            {
                szEncodedData += "+";
                break;
            }
        default:
            {
                nToNumber = (int)szData[i];
                sprintf(szEncodedChar, "%%%02X", nToNumber < 0 ? (nToNumber + 256) : nToNumber);
                szEncodedData += szEncodedChar;
            }
            break;
        }
    }
    
    return szEncodedData;
}


/**
* 문자열을 UTF-8 로 인코딩 후 percent encoding 한다.
*
* @param szData 변경할 문자열
* @return 변경된 문자열
*/
std::string CPercentEncode::EncodeUTF8(std::string szData)
{
    LOG1("CPercentEncode::EncodeUTF8\n");

    if (szData.size() == 0)
    {
        return "";
    }

    std::string szUTF8;
    ConvertType("UTF-8", "EUC-KR", szUTF8, szData);

    return Encode(szUTF8);
}


/**
* content 형태를 변경한다. 이 변경에 따라서 [space] 가
* + 로 변경되거나 %20 으로 변경이 된다.
*
* @param bURLEncoded content type 옵션 값
*/
void CPercentEncode::SetContentType(bool bContentType)
{
    LOG1("CPercentEncode::SetContentType\n");

    _bContentType = bContentType;
}
[/code]

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

wp7 sdk  (0) 2013.10.02
xml parser  (0) 2013.10.02
openssl & wcecompat  (0) 2013.10.02
xml schema  (0) 2013.10.02
syncml  (0) 2013.10.02