URL 스트링으로 인코딩
개발 2007. 11. 12. 10:54저자 : 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;
}