'비트연산'에 해당되는 글 1건

  1. 2007.11.12 URL 스트링으로 인코딩

URL 스트링으로 인코딩

개발 2007. 11. 12. 10:54

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

저자 : hanburn

날짜 : 2007-11-09

웹서버와 통신을 할 때 GET 또는 POST method를 사용하여 통신을 하게 됩니다. 파라미터로 어떤 값을 보내야 할 때 한글이나 공백등이 있으면 URL 표현 규칙에 않맞게 되어 서버쪽에서 올바르게 인식을 못하게 됩니다. ‘Good’ 이나 김희선처럼 붙어 있는 단어는 상관이 없지만 김 희선’ ‘boy friend’ 처럼 중간에 공백이 있을때는 서버에서 인식을 못하게 됩니다.

 

이런 경우에 아래처럼 인코딩을 해서 보내주어야 합니다.

 

‘boy friend’ => ‘%62%6f%79%20%66%72%69%65%6e%64’

김 희선’ => ‘%b1%e8%20%c8%f1%bc%b1’

 

변환되는 규칙을 살펴보면 빈문자(스페이스) %20으로 변환 되는 것을 알 수 있고 ‘b’ %62로 변환되는 것을 알 수 있습니다. ~ 이건 바로 해당 문자의 아스키값을 16진수로 표현한 것에 앞에 %를 추가한 것임을 알 수 있습니다. 코드로는 간단하게 sprintf를 사용하여 16진수로 변환을 할 수도 있지만 직접 비트연산을 통해서 변환하는 함수를 만들어 보았습니다.

 

long TextToUrlString(TCHAR* szText, TCHAR* out, unsigned len)

{

        unsigned nSrcLen = lstrlen(szText);

 

        // check output buff

        if( nSrcLen*3 >= len)         return 0;

 

        int nIdx = 0;

        for( int i=0 ; i < nSrcLen ; ++i)

        {

               out[nIdx++] = '%';

               char src = szText[i];

 

               char leftI = src & 0x0f;

               char rightI = (src>>4) & 0x0f;

 

               char leftA[2] = {0}; 

               char rightA[2] = {0}; 

               itoa(leftI, leftA, 16);

               itoa(rightI, rightA, 16);

 

               out[nIdx++] = rightA[0];

               out[nIdx++] = leftA[0];              

        }

 

        out[nIdx] = 0;

 

        return nIdx;

}

 

텍스트 문자를 url스트링으로 변환을 했으면 반대로 url스트링을 텍스트로 변환하는 함수도 있어야 겠죠..  그래서..

 

long UrlStringToText(TCHAR* szUrlString, TCHAR* out, unsigned len)

{

        unsigned nSrcLen = lstrlen(szUrlString);

 

        // check output buff

        unsigned nTargetLen = nSrcLen/3;

        if( nTargetLen >= len)        return 0;

 

        int nSrcIdx = 0;

        int nTargetIdx=0;

        for( nTargetIdx=0 ; nTargetIdx < nTargetLen ; ++nTargetIdx)

        {

               //

               char ch[3];

               ch[0] = szUrlString[nSrcIdx++];              // %          

               ch[1] = szUrlString[nSrcIdx++];              //

               ch[2] = szUrlString[nSrcIdx++];              //

 

              

               ch[1] = tolower(ch[1]);

               ch[2] = tolower(ch[2]);

 

               // 16진수

               if( ch[1] > '9' )

                       ch[1] = ch[1] - 'a' + 10;

               else

                       ch[1] = ch[1] - '0';

 

               if( ch[2] > '9' )

                       ch[2] = ch[2] - 'a' + 10;

               else

                       ch[2] = ch[2] - '0';

 

               char target = (ch[1]<<4) | ch[2];

 

               out[nTargetIdx] = target;            

        }

 

        out[nTargetIdx] = 0;

 

        return nTargetIdx;

              

}

 



: