본문 바로가기

C-Language/CGI, URL Decode

CGI, URL Decode example

CGI, URL Decode example

웹브라우저에서 웹서버로 데이터가 전송될 때, POST방식으로 전달되는 경우에 한글, 공백문자, 특수문자 등은 %기호 다음에 16진수 문자열로 변환되어 전송된다. 그러므로 서버측에서는 다시 %기호뒤의 16진수 2자리를 찾아서 원래의 데이터로 변환하여 사용해야 한다. 브라우저 측에서는 URL Encoding을 해서 전송하면 서버측에서는 URL Decoding을 적용해서 사용해야 한다는 의미이다.

서버측에서 수행해야 하는 변환작업은 매우 간단하다. 요청 문자열에서 %기호를 발견하면 그 뒤의 2자리 문자는 16진수로 변환되어 있기 때문에 원래의 데이터(10진 정수)로 변환해 주면 되는 것이다.

다음과 같은 함수를 작성하고 호출해주면 된다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void urldecode(char *src, char *last, char *dest);

int main(void) {
 
 /* 웹브라우저에서 URL Encoding된 것으로 가정한 테스트용 문자열 */
 char *src = "abc+123%c3%d5"; // '+'는 공백, %xx는 한글이나 특수문자에 해당함
 char dest[60];
 char *last = src + strlen(src);

 /* URL Decoding을 적용하여 원래의 문자열로 복원한다 */
 urldecode(src, last, dest);

 /* 변환에 성공했는지 출력하여 확인해본다 */
 printf("변환된 문자열=%s \n", dest);

 return 0;

}

/* URL Decoding을 수행하는 함수 */
void urldecode(char *src, char *last, char *dest) {
 for(; src<=last ; src++, dest++)
 {
  if(*src=='%')
  {
   int code;
   /* '%'기호 뒤에 있는 2개의 문자를 16진수로 읽어서 정수로 저장한다 
    sscanf()함수의 사용법은 여기를 참고하세요*/

   if(sscanf(src+1, "%2x", &code)!=1) code='?';
   *dest = code;
   src+=2;
  }
  else if(*src=='+') { /* '+' 기호는 공백문자로 복원해준다  */
   *dest = ' ';
  }
  else {
   *dest = *src; /* 그 외의 문자(영문)는 그대로 저장한다 */
  }
 }
 *(++dest) = '\0';

}