2020년 4월 11일 토요일

MFC URLEncode 처리

오늘 이야기할 내용은 MFC 에서 웹으로 데이터를 보낼때 한글이 깨지거나 특수 문자 등을 처리 할때 깨지지 않고 보내기 위해서 보내는 방법중 URLEncode 처리 방법을 이야기 할까 합니다.

라이브러리를 설치 해서 쓰면 되지만 라이브러리 때문에 빌드가 안되거나 하는 상황이 많기 때문에 직접 구현 하는 방법으로 안내 할까 합니다.

​일단 소스 부터 볼께요.




BYTE ConHex(const BYTE& uc){ return uc > 9 ? uc + 55 : uc + 48; }

CString ConvertURLEncode(CString sOrg)
{
 CString sOut;
 const int nLen = sOrg.GetLength() + 1;
 register LPBYTE pOutTmp = NULL;
 LPBYTE pOutBuf = NULL;
 register LPBYTE pInTmp = NULL;
 LPBYTE pInBuf = (LPBYTE)sOrg.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
   {
    *pOutTmp++ = '%';
    *pOutTmp++ = ConHex(*pInTmp >> 4);
    *pOutTmp++ = ConHex(*pInTmp % 16);
   }
   pInTmp++;
  }
  *pOutTmp = '\0';
  sOut.ReleaseBuffer();
 }
 sOrg.ReleaseBuffer();

 return sOut;
}
[위 소스는 Visual Studio 2017, Window 10 64bit 환경에서 빌드 되었습니다.]

소스를 보시면 아시겠지만 URLEncode 는 숫자,영문,몇개의 특수문자 외의 문자열은 HEX 값으로 변환하여 전달하는 방법입니다.

물론 받는 쪽에서는 DeCode를 해서 풀어야 정상적인 문자열로 확인 할수 있습니다.

웹이랑 데이터를 주고 받기 위해서는 단순히 URLEncode 만 호출 해서 해결 할수 있지만 개발되는 프로그램 플랫폼 환경이 Ansi 환경이면 UTF8로 변환 한후 그것을 다시 URLEncode로 변환하여 전달 해야 정상적으로 웹에 전달이 됩니다.

아래 링크도 확인 하시기 바랍니다.
https://ansur.blogspot.com/2020/04/mfc-ansi-utf8.html

그럼 ^^

댓글 없음: