웹브라우저에서 웹서버로 전달되는 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';
}