void URLencode( char * output , char * input)
{
// RFC 1738 참조
// 16진수로 봐서 00-1F 랑 7F 값은 %를 붙이고 헥사로 바꾼다 .
// 80-FF 그리고 아래와 같은 controlling character들
// { } | \ ^ ~ [ ] ` # ; / ? : @ = &
// 예를 들어서 스페이스 ( 빈칸 )은
// Dec 값으로 32구 Hex값으로 20이니까
// 빈칸대신 %20 를 붙이는 식입니다
int opt_inx, ipt_inx;
for ( ipt_inx = 0 , opt_inx =0 ; input[ipt_inx]; ipt_inx++,opt_inx++)
{
int char_val = input[ipt_inx];
if ( char_val < 0 ) char_val +=256;
// 그리고 어레이를 참조하게 되면 그만큼 느리기때문에 char_val에 값을 넣습니다
// char를 int 로 바꾸는 과정에서 127이 넘는 값은 음수로 들어가기때문에
// 위와 같이 256을 더합니다
if (
char_val <= 0x1F ||
char_val == 0x7F ||
char_val >=0x80 ||
char_val == ' ' ||
char_val == '{' ||
char_val == '}' ||
char_val == '[' ||
char_val == ']' ||
char_val == '|' ||
char_val == '\\' ||
char_val == '^' ||
char_val == '~' ||
char_val == '`' ||
char_val == '#' ||
char_val == ';' ||
char_val == '/' ||
char_val == '?' ||
char_val == '@' ||
char_val == '=' ||
char_val == '&' )
{
output[opt_inx]='%';
int UpperBit = char_val / 0x10;
// 16을 나눠서 상위바이트를 얻습니다.
if (UpperBit >=0 && UpperBit <=9 )
output[++opt_inx]= UpperBit+'0';
else
output[++opt_inx]= UpperBit+'A'-10;
// 값을 보고 숫자인지 A~ E 인지 구분해보고 넣습니다.
// 16으로 나누면 하위 바이트가 나오겠죠..
int LowerBit = char_val % 0x10;
if (LowerBit >=0 && LowerBit <=9 )
output[++opt_inx]= LowerBit+'0';
else
output[++opt_inx]= LowerBit+'A'-10;
}
else
output[opt_inx]=char_val;
}
output[opt_inx]=0;
}
참조 사이트: