ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • URL을 UTF8 방식으로 Encoding/Decoding 하기...
    공장 이야기 2014. 4. 23. 17:22

    소스 나갑니다.


    ------------------------------------------------------------------------------------------------

    .h

    class UTF8ForURL

    {

    public:

        UTF8ForURL(void);

        virtual ~UTF8ForURL(void);


        WCHAR* EncodeToUTF8(WCHAR* szSource);

        WCHAR* DecodeFromUTF8(WCHAR* szSource);

    };


    BYTE makeByte(WCHAR ch1, WCHAR ch2);




    ------------------------------------------------------------------------------------------------

    .cpp

    BYTE makeByte(WCHAR ch1, WCHAR ch2)

    {

        BYTE bt1 = 0, bt2 = 0;


        switch(ch2)

        {

        case L'0':

            bt2 = 0x00;

            break;

        case L'1':

            bt2 = 0x01;

            break;

        case L'2':

            bt2 = 0x02;

            break;

        case L'3':

            bt2 = 0x03;

            break;

        case L'4':

            bt2 = 0x04;

            break;

        case L'5':

            bt2 = 0x05;

            break;

        case L'6':

            bt2 = 0x06;

            break;

        case L'7':

            bt2 = 0x07;

            break;

        case L'8':

            bt2 = 0x08;

            break;

        case L'9':

            bt2 = 0x09;

            break;

        case L'A':

            bt2 = 0x0A;

            break;

        case L'B':

            bt2 = 0x0B;

            break;

        case L'C':

            bt2 = 0x0C;

            break;

        case L'D':

            bt2 = 0x0D;

            break;

        case L'E':

            bt2 = 0x0E;

            break;

        case L'F':

            bt2 = 0x0F;

            break;

        }


        switch (ch1)

        {

        case L'0':

            bt1 = 0x00;

            break;

        case L'1':

            bt1 = 0x10;

            break;

        case L'2':

            bt1 = 0x20;

            break;

        case L'3':

            bt1 = 0x30;

            break;

        case L'4':

            bt1 = 0x40;

            break;

        case L'5':

            bt1 = 0x50;

            break;

        case L'6':

            bt1 = 0x60;

            break;

        case L'7':

            bt1 = 0x70;

            break;

        case L'8':

            bt1 = 0x80;

            break;

        case L'9':

            bt1 = 0x90;

            break;

        case L'A':

            bt1 = 0xA0;

            break;

        case L'B':

            bt1 = 0xB0;

            break;

        case L'C':

            bt1 = 0xC0;

            break;

        case L'D':

            bt1 = 0xD0;

            break;

        case L'E':

            bt1 = 0xE0;

            break;

        case L'F':

            bt1 = 0xF0;

            break;

        }


        BYTE btFinal = bt2 | bt1;


        return  btFinal;


    }


    UTF8ForURL::UTF8ForURL(void)

    {

    }


    UTF8ForURL::~UTF8ForURL(void)

    {

    }


    WCHAR* UTF8ForURL::EncodeToUTF8(WCHAR* szSource)

    {

        WORD ch;

        BYTE bt1, bt2, bt3, bt4, bt5, bt6;

        size_t nLoop, nMax = wcslen(szSource);

        int nEncodePos = 0;

        WCHAR pszTemp[19] = { 0, };

        WCHAR* pszFinal = 0;


        pszFinal = (WCHAR *)::malloc(((nMax*18)+1)*sizeof(WCHAR));

        if(0 == pszFinal)

            return 0;

        ::memset(pszFinal, 0, ((nMax*18)+1)*sizeof(WCHAR));


        for(nLoop=0; nLoop<nMax; ++nLoop)

        {

            ch = (WORD)szSource[nLoop];


            if(ch == L'%%')

            {

                ::memset(pszTemp, 0, 19);


                wsprintfW(pszTemp, L"%%%02X", ch);

                ::memcpy(&pszFinal[nEncodePos], pszTemp, 3*sizeof(WCHAR));


                nEncodePos = nEncodePos + 3;

            }

            else if(ch < 128)

            {

                pszFinal[nEncodePos] = szSource[nLoop];


                nEncodePos = nEncodePos + 1;

            }

            else if(ch <= 2047)

            {

                ::memset(pszTemp, 0, 19);


                bt1 = (BYTE)(192 + (ch / 64));

                bt2 = (BYTE)(128 + (ch % 64));

                wsprintfW(pszTemp, L"%%%02X%%%02X", bt1, bt2);

                ::memcpy(&pszFinal[nEncodePos], pszTemp, 6*sizeof(WCHAR));


                nEncodePos = nEncodePos + 6;

            }

            else if(ch <= 65535)

            {

                ::memset(pszTemp, 0, 19);


                bt1 = (BYTE)(224 + (ch / 4096));

                bt2 = (BYTE)(128 + ((ch / 64) % 64));

                bt3 = (BYTE)(128 + (ch % 64));

                wsprintfW(pszTemp, L"%%%02X%%%02X%%%02X", bt1, bt2, bt3);

                ::memcpy(&pszFinal[nEncodePos], pszTemp, 9*sizeof(WCHAR));


                nEncodePos = nEncodePos + 9;

            }

            else if(ch <= 2097151)

            {

                ::memset(pszTemp, 0, 19);


                bt1 = (BYTE)(240 + (ch / 262144));

                bt2 = (BYTE)(128 + ((ch / 4096) % 64));

                bt3 = (BYTE)(128 + ((ch / 64) % 64));

                bt4 = (BYTE)(128 + (ch % 64));

                wsprintfW(pszTemp, L"%%%02X%%%02X%%%02X%%%02X", bt1, bt2, bt3, bt4);

                ::memcpy(&pszFinal[nEncodePos], pszTemp, 12*sizeof(WCHAR));


                nEncodePos = nEncodePos + 12;

            }

            else if(ch <=67108863)

            {

                ::memset(pszTemp, 0, 19);


                bt1 = (BYTE)(248 + (ch / 16777216));

                bt2 = (BYTE)(128 + ((ch / 262144) % 64));

                bt3 = (BYTE)(128 + ((ch / 4096) % 64));

                bt4 = (BYTE)(128 + ((ch / 64) % 64));

                bt5 = (BYTE)(128 + (ch % 64));

                wsprintfW(pszTemp, L"%%%02X%%%02X%%%02X%%%02X%%%02X", bt1, bt2, bt3, bt4, bt5);

                ::memcpy(&pszFinal[nEncodePos], pszTemp, 15*sizeof(WCHAR));


                nEncodePos = nEncodePos + 15;

            }

            else if(ch <=2147483647)

            {

                ::memset(pszTemp, 0, 19);


                bt1 = (BYTE)(252 + (ch / 1073741824));

                bt2 = (BYTE)(128 + ((ch / 16777216) % 64));

                bt3 = (BYTE)(128 + ((ch / 262144) % 64));

                bt4 = (BYTE)(128 + ((ch / 4096) % 64));

                bt5 = (BYTE)(128 + ((ch / 64) % 64));

                bt6 = (BYTE)(128 + (ch % 64));

                wsprintfW(pszTemp, L"%%%02X%%%02X%%%02X%%%02X%%%02X%%%02X", bt1, bt2, bt3, bt4, bt5, bt6);

                ::memcpy(&pszFinal[nEncodePos], pszTemp, 18*sizeof(WCHAR));


                nEncodePos = nEncodePos + 18;

            }

        }


        return pszFinal;

    }


    WCHAR* UTF8ForURL::DecodeFromUTF8(WCHAR* szSource)

    {

        size_t nLoop, nMax = wcslen(szSource);

        WORD ch;

        BYTE z, y, x, w, v, u;

        WCHAR pszTemp[19] = { 0, };

        WCHAR* pszFinal = 0;

        int nDecodePos = 0;


        pszFinal = (WCHAR *)::malloc((nMax+1)*sizeof(WCHAR));

        if(0 == pszFinal)

            return 0;

        ::memset(pszFinal, 0, (nMax+1)*sizeof(WCHAR));


        for (nLoop=0; nLoop<nMax; ++nLoop)

        {

            ch = (WORD)szSource[nLoop];


            if(ch != L'%%')

            {

                pszFinal[nDecodePos] = (WCHAR)ch;

                goto endPoint;

            }


            if (nLoop >= nMax - 2)

                break; // something is wrong

            z = makeByte(szSource[nLoop+1], szSource[nLoop+2]);


            if(z < 127)

            {

                pszFinal[nDecodePos] = (WCHAR)z;

                nLoop = nLoop + 2;

            }

            else if(z >= 192 && z <= 223)

            {

                // character is two bytes

                if (nLoop >= nMax - 5)

                    break; // something is wrong

                y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);

                pszFinal[nDecodePos] = (WCHAR)( (z-192)*64 + (y-128) );

                nLoop = nLoop + 5;

            }

            else if(z >= 224 && z <= 239)

            {

                // character is three bytes

                if (nLoop >= nMax - 8)

                    break; // something is wrong

                y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);

                x = makeByte(szSource[nLoop+7], szSource[nLoop+8]);

                pszFinal[nDecodePos] = (WCHAR)( (z-224)*4096 + (y-128)*64 + (x-128) );

                nLoop = nLoop + 8;

            }

            else if(z >= 240 && z <= 247)

            {

                // character is four bytes

                if (nLoop >= nMax - 11)

                    break; // something is wrong

                y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);

                x = makeByte(szSource[nLoop+7], szSource[nLoop+8]);

                w = makeByte(szSource[nLoop+10], szSource[nLoop+11]);

                pszFinal[nDecodePos] = (WCHAR)( (z-240)*262144 + (y-128)*4096 + (x-128)*64 + (w-128) );

                nLoop = nLoop + 11;

            }

            else if(z >= 248 && z <= 251)

            {

                // character is four bytes

                if (nLoop >= nMax - 14)

                    break; // something is wrong

                y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);

                x = makeByte(szSource[nLoop+7], szSource[nLoop+8]);

                w = makeByte(szSource[nLoop+10], szSource[nLoop+11]);

                v = makeByte(szSource[nLoop+13], szSource[nLoop+14]);

                pszFinal[nDecodePos] = (WCHAR)( (z-248)*16777216 + (y-128)*262144 + (x-128)*4096 + (w-128)*64 + (v-128) );

                nLoop = nLoop + 14;

            }

            else if(z >= 252 && z <= 253)

            {

                // character is four bytes

                if (nLoop >= nMax - 17)

                    break; // something is wrong

                y = makeByte(szSource[nLoop+4], szSource[nLoop+5]);

                x = makeByte(szSource[nLoop+7], szSource[nLoop+8]);

                w = makeByte(szSource[nLoop+10], szSource[nLoop+11]);

                v = makeByte(szSource[nLoop+13], szSource[nLoop+14]);

                u = makeByte(szSource[nLoop+16], szSource[nLoop+17]);

                pszFinal[nDecodePos] = (WCHAR)( (z-252)*1073741824 + (y-128)*16777216 + (x-128)*262144 + (w-128)*4096 + (v-128)*64 + (u-128) );

                nLoop = nLoop + 17;

            }


    endPoint:

            nDecodePos++;

        }


        return pszFinal;

    }

    '공장 이야기' 카테고리의 다른 글

    Node.JS 설정 변경 시  (0) 2015.08.11
    webkit Visual Studio 빌드 시 오류.  (0) 2014.06.16
    Webkit 해당 기능 ENABLE 시키기!!!  (0) 2013.03.20
    Webkit 빌드 시 언로드 가능 한 Project  (0) 2012.11.16
    Webkit bug!!!  (0) 2012.10.25
Designed by Tistory.