본문 바로가기

C-Language/URL Decoding

URL Decoding example

웹브라우저에서 웹서버로 전달되는 HTTP 데이터는 영문을 제외한 특수문자나 한글을 전달할 때
URL Encoding을 적용하여 '%C7' 과 같이 16진수 문자열로 변환하여 전송하게 된다.
그러므로 서버측에서는 16진수 문자열을 다시 원래의 문자열로 변환해 줄 필요가 있다.

다음은 URL Encoding이 적용된 문자열을 다시 원래의 문자열로 변화하는 예이다.

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

/* URL Encoding 된 한글을 다시 원래의 문자열로 디코딩하는 예
*  특수문자나 한글은 %00 형식의 16진수 문자열로 변환되어 서버로 전송되므로
*  서버측에서는 16진수 문자열을 다시 원래의 문자열로 변환할 필요가 있다 */

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

int main(void) {

 char *kor = "함수";
 char *enc;
 char dest[128];

 /* ANSI 한글 표현법 */
 printf("%X %X %X %X\n", kor[0],kor[1],kor[2],kor[3]);// C7 D4 BC F8 출력됨

 printf("%c%c%c%c\n", 0xC7,0xD4,0xBC,0xF6); // '함수' 출력됨

 /* 웹브라우저에서 웹서버로 전송되는 HTTP 데이터는 ANSI문자열을 사용함
 *  한글이 URL 인코딩되면 ANSI표현에 '%'기호가 붙어서 서버로 전달된다*/

 enc = "%C7%D4%BC%F6";
 urldecode(enc, enc+strlen(enc), dest);
 printf("디코딩된 후의 문자열=%s \n", dest);
}

void urldecode(char *src, char *last, char *dest) {
 for(;src<=last;src++,dest++){
  if(*src=='%'){
   int code;
   if(sscanf(src+1, "%2x", &code)!=1) code='?';// 특수문자(한글)인 경우
   *dest = code;
   src+=2;
  }else if(*src=='+') {//공백문자인 경우
   *dest = ' ';
  }else {
   *dest = *src; //영문자인 경우
  }
 }
 *(++dest) = '\0';
}




 

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

/* url encoding 적용된 파라미터 문자열을 다시 디코딩하는 예 */

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

int main(void) {

 char buf[128];
 char dest[128];
 char keyword[64];

 FILE * file;
 file = fopen("param_test.dat", "w");
 if(file==NULL) {
  printf("쓰기용 파일열기 실패\n");
  return 0;
 }

 /* 웹서버로 전달되는 파라미터와 동일하게 url encoding적용된 문자열을 파일에 저장한다
 *  실제 웹서버로 전달되는 16진수 문자열은 '%'기호가 한개이지만 C언어에서 '%'기호를 문자열로
 *  파일에 저장하기 위해서는 '%'기호를 연속해서 2개를 사용해야만 뒤에 있는 한개의 '%'기호가
 *  저장된다*/

 // 'search=sscanf 함수 Reference' 문자열을 URL Encoding 적용한 경우
 fprintf(file,"search=sscanf+%%C7%%D4%%BC%%F6+Reference");
 fclose(file);

 file = fopen("param_test.dat", "r");
 if(file==NULL) {
  printf("읽기용 파일열기 실패\n");
  return 0;
 }

 fgets(buf,127,file);
 printf("URL 인코딩된 파라미터 문자열=%s\n", buf);

 sscanf(buf,"search=%[^'&']", keyword);// search 파라미터의 값을 추출한다.
 printf("search 파라미터의 값=%s\n", keyword);

 /* 16진수문자로 구성된 파라미터 문자열을 다시 원래의 문자열로 디코딩한다 */
 urldecode(keyword, keyword+strlen(keyword), dest);
 printf("URL 디코딩된 파라미터 문자열=%s\n", dest);
}

void urldecode(char *src, char *last, char *dest) {
 for(;src<=last;src++,dest++){
  if(*src=='%'){
   int code;
   if(sscanf(src+1, "%2x", &code)!=1) code='?';
   *dest = code;
   src+=2;
  }else if(*src=='+') {
   *dest = ' ';
  }else {
   *dest = *src;
  }
 }
 *(++dest) = '\0';
}