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';
}