천객만래 [千客萬來] (It has an interminable succession of visitors)

[개발/VC++] URLEncode, URLDecode, 유니코드 변환 소스



[개발/VC++] URLEncode, URLDecode, UTF8 변환 소스


[유니코드 문자집합용]


CString Unicode_URLDecode( CString strEncodedText )
{
 CString strResult;
 wchar_t ch0, ch1, ch2;
 wchar_t wch;
 TCHAR tch;
 int i = 0;


 while( i<strEncodedText.GetLength() )
 {
  tch = strEncodedText.GetAt(i);
  
  if( tch != _T('%') )
  {
   // a character not encoded
   strResult += tch;
   i++;
  }
  else
  {
   // a character encoded !!
   ch0 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
   i += 3;


   if( ch0 < 0x80 )
    // 1 byte for UTF-8
    // 0xxx xxxx
    wch = ch0;
   else
   {
    if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
     continue;


    ch1 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
    i += 3;


    if( ch0 < 0xe0 )
    {
     // 2 byte for UTF-8
     // 110x xxxx 10xx xxxx
     wch = ((ch0&0x1f)<<6)
      | (ch1&0x3f);
    }
    else
    {
     // 3 byte for UTF-8
     if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
      continue;


     ch2 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
     i += 3;


     // 1110 xxxx 10xx xxxx 10xx xxxx
     wch = ((ch0&0x0f)<<12)
      | ((ch1&0x3f)<<6)
      | (ch2&0x3f);
    }
   }
   strResult += wch;
  }
 }


 return strResult;
}

 

-------------------------------------------------------------------------------------------
[멀티바이트 문자집합용]


inline BYTE CURLEncode::toHex(const BYTE &x) {
 return x > 9 ? x + 55: x + 48;
}


inline BYTE CURLEncode::toByte(const BYTE &x) {
 return x > 57? x - 55: x - 48;
}

CString CURLEncode::URLDecode(CString sIn)
{
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);
    
    if(pOutBuf)
    {
        pInTmp   = pInBuf;
        pOutTmp = pOutBuf;
        // do encoding
        while (*pInTmp)
        {
            if('%'==*pInTmp)
            {
                pInTmp++;
                *pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;
                pInTmp++;
            }
            else if('+'==*pInTmp)
                *pOutTmp++ = ' ';
            else
                *pOutTmp++ = *pInTmp;
            pInTmp++;
        }
        *pOutTmp = '\0';
        sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
    
    return sOut;
}


CString CURLEncode::URLEncode(CString sIn)
{
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3);
    
    if(pOutBuf)
    {
        pInTmp   = pInBuf;
        pOutTmp = pOutBuf;
        // do encoding
        while (*pInTmp)
        {
            if(isalnum(*pInTmp) || '-'==*pInTmp || '_'==*pInTmp || '.'==*pInTmp)
                *pOutTmp++ = *pInTmp;
            else if(isspace(*pInTmp))
                *pOutTmp++ = '+';
            else
            {
                *pOutTmp++ = '%';
                *pOutTmp++ = toHex(*pInTmp>>4);
                *pOutTmp++ = toHex(*pInTmp%16);
            }
            pInTmp++;
        }
        *pOutTmp = '\0';
        sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
    
    return sOut;
}


 





Posted by SB패밀리

[개발/VC++] URLEncode, URLDecode, UTF8 변환 소스



아래 소스는 멀티바이트 문자집합 프로젝트 설정으로 작업해야 작동된다.

inline BYTE toHex(const BYTE &x)
{
       return x > 9 ? x + 55: x + 48;
}

CString URLEncode(CString sIn)
{
       CString sOut;
       const int nLen = sIn.GetLength() + 1;
       register LPBYTE pOutTmp = NULL;
       LPBYTE pOutBuf = NULL;
       register LPBYTE pInTmp = NULL;
       LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
       BYTE b = 0;

       //alloc out buffer
       pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2);//new BYTE [nLen * 3];

       if(pOutBuf)
       {
             pInTmp   = pInBuf;
              pOutTmp = pOutBuf;

              // do encoding
              while (*pInTmp)
              {
                     if(isalnum(*pInTmp))
                            *pOutTmp++ = *pInTmp;
                     else
                            if(isspace(*pInTmp))
                                   *pOutTmp++ = '+';
                            else
                            {
                                   *pOutTmp++ = '%';
                                   *pOutTmp++ = toHex(*pInTmp>>4);
                                   *pOutTmp++ = toHex(*pInTmp%16);
                            }
                     pInTmp++;
              }
              *pOutTmp = '\0';
              //sOut=pOutBuf;
              //delete [] pOutBuf;
              sOut.ReleaseBuffer();
       }
       sIn.ReleaseBuffer();
       return sOut;
}


UrlDecode:
#define IsHexNum(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'))

CString Utf8ToStringT(LPSTR str)
{
    _ASSERT(str);
    USES_CONVERSION;
    WCHAR *buf;
    int length = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    buf = new WCHAR[length+1];
    ZeroMemory(buf, (length+1) * sizeof(WCHAR));
    MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, length);

    return (CString(W2T(buf)));
}

CString UrlDecode(LPCTSTR url)
{
    _ASSERT(url);
    USES_CONVERSION;
    LPSTR _url = T2A(const_cast<LPTSTR>(url));
    int i = 0;
    int length = (int)strlen(_url);
    CHAR *buf = new CHAR[length];
    ZeroMemory(buf, length);
    LPSTR p = buf;
    while(i < length)
    {
        if(i <= length -3 && _url[i] == '%' && IsHexNum(_url[i+1]) && IsHexNum(_url[i+2]))
        {
            sscanf(_url + i + 1, "%x", p++);
            i += 3;
        }
        else
        {
            *(p++) = _url[i++];
        }
    }
    return Utf8ToStringT(buf);
}








Posted by SB패밀리

[개발/VC++] URLEncode, URLDecode, UTF8 변환 소스


[유니코드 문자집합용]


CString Unicode_URLDecode( CString strEncodedText )
{
 CString strResult;
 wchar_t ch0, ch1, ch2;
 wchar_t wch;
 TCHAR tch;
 int i = 0;


 while( i<strEncodedText.GetLength() )
 {
  tch = strEncodedText.GetAt(i);
  
  if( tch != _T('%') )
  {
   // a character not encoded
   strResult += tch;
   i++;
  }
  else
  {
   // a character encoded !!
   ch0 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
   i += 3;


   if( ch0 < 0x80 )
    // 1 byte for UTF-8
    // 0xxx xxxx
    wch = ch0;
   else
   {
    if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
     continue;


    ch1 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
    i += 3;


    if( ch0 < 0xe0 )
    {
     // 2 byte for UTF-8
     // 110x xxxx 10xx xxxx
     wch = ((ch0&0x1f)<<6)
      | (ch1&0x3f);
    }
    else
    {
     // 3 byte for UTF-8
     if( strEncodedText.GetAt(i)!= _T('%') ) // Error!
      continue;


     ch2 = _tcstol( strEncodedText.Mid( i+1, 2 ), NULL, 16 );
     i += 3;


     // 1110 xxxx 10xx xxxx 10xx xxxx
     wch = ((ch0&0x0f)<<12)
      | ((ch1&0x3f)<<6)
      | (ch2&0x3f);
    }
   }
   strResult += wch;
  }
 }


 return strResult;
}

 

-------------------------------------------------------------------------------------------
[멀티바이트 문자집합용]


inline BYTE CURLEncode::toHex(const BYTE &x) {
 return x > 9 ? x + 55: x + 48;
}


inline BYTE CURLEncode::toByte(const BYTE &x) {
 return x > 57? x - 55: x - 48;
}

CString CURLEncode::URLDecode(CString sIn)
{
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);
   
    if(pOutBuf)
    {
        pInTmp   = pInBuf;
        pOutTmp = pOutBuf;
        // do encoding
        while (*pInTmp)
        {
            if('%'==*pInTmp)
            {
                pInTmp++;
                *pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;
                pInTmp++;
            }
            else if('+'==*pInTmp)
                *pOutTmp++ = ' ';
            else
                *pOutTmp++ = *pInTmp;
            pInTmp++;
        }
        *pOutTmp = '\0';
        sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
   
    return sOut;
}


CString CURLEncode::URLEncode(CString sIn)
{
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3);
   
    if(pOutBuf)
    {
        pInTmp   = pInBuf;
        pOutTmp = pOutBuf;
        // do encoding
        while (*pInTmp)
        {
            if(isalnum(*pInTmp) || '-'==*pInTmp || '_'==*pInTmp || '.'==*pInTmp)
                *pOutTmp++ = *pInTmp;
            else if(isspace(*pInTmp))
                *pOutTmp++ = '+';
            else
            {
                *pOutTmp++ = '%';
                *pOutTmp++ = toHex(*pInTmp>>4);
                *pOutTmp++ = toHex(*pInTmp%16);
            }
            pInTmp++;
        }
        *pOutTmp = '\0';
        sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
   
    return sOut;
}


 

Posted by SB패밀리

[개발/VC++] URLEncode, URLDecode, UTF8 변환 소스

아래 소스는 멀티바이트 문자집합 프로젝트 설정으로 작업해야 작동된다.

inline BYTE toHex(const BYTE &x)
{
       return x > 9 ? x + 55: x + 48;
}

CString URLEncode(CString sIn)
{
       CString sOut;
       const int nLen = sIn.GetLength() + 1;
       register LPBYTE pOutTmp = NULL;
       LPBYTE pOutBuf = NULL;
       register LPBYTE pInTmp = NULL;
       LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
       BYTE b = 0;

       //alloc out buffer
       pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2);//new BYTE [nLen * 3];

       if(pOutBuf)
       {
             pInTmp   = pInBuf;
              pOutTmp = pOutBuf;

              // do encoding
              while (*pInTmp)
              {
                     if(isalnum(*pInTmp))
                            *pOutTmp++ = *pInTmp;
                     else
                            if(isspace(*pInTmp))
                                   *pOutTmp++ = '+';
                            else
                            {
                                   *pOutTmp++ = '%';
                                   *pOutTmp++ = toHex(*pInTmp>>4);
                                   *pOutTmp++ = toHex(*pInTmp%16);
                            }
                     pInTmp++;
              }
              *pOutTmp = '\0';
              //sOut=pOutBuf;
              //delete [] pOutBuf;
              sOut.ReleaseBuffer();
       }
       sIn.ReleaseBuffer();
       return sOut;
}


UrlDecode:
#define IsHexNum(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'))

CString Utf8ToStringT(LPSTR str)
{
    _ASSERT(str);
    USES_CONVERSION;
    WCHAR *buf;
    int length = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    buf = new WCHAR[length+1];
    ZeroMemory(buf, (length+1) * sizeof(WCHAR));
    MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, length);

    return (CString(W2T(buf)));
}

CString UrlDecode(LPCTSTR url)
{
    _ASSERT(url);
    USES_CONVERSION;
    LPSTR _url = T2A(const_cast<LPTSTR>(url));
    int i = 0;
    int length = (int)strlen(_url);
    CHAR *buf = new CHAR[length];
    ZeroMemory(buf, length);
    LPSTR p = buf;
    while(i < length)
    {
        if(i <= length -3 && _url[i] == '%' && IsHexNum(_url[i+1]) && IsHexNum(_url[i+2]))
        {
            sscanf(_url + i + 1, "%x", p++);
            i += 3;
        }
        else
        {
            *(p++) = _url[i++];
        }
    }
    return Utf8ToStringT(buf);
}


 

Posted by SB패밀리