개발하는 두더지

[C/C++/MFC] URLEncode, URLDecode 본문

C,C++

[C/C++/MFC] URLEncode, URLDecode

덜지 2016. 7. 22. 03:37

# 웹 관련 프로그래밍시 문자열을 GET이나 POST 방식으로 Ajax Send를 통해 보낼때 

IE : 원문 문자열

Chrome , Firefox, Safari, Oprea : UTF-8 인코딩한 문자열

브라우저 별로 다른 값이 넘어간다. 한글이 인코딩되서 넘어가기 때문에 받는 쪽에서 그대로 처리한다면 문제가 발생한다.


# 인코딩된 문자열이 넘어갈 때 적용 방식

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <stdlib.h>
        
static char _x2c(char hex_up, char hex_low) 
{
        char digit;
 
        digit = 16 * (hex_up >= 'A' 
                ? ((hex_up & 0xdf- 'A'+ 10 : (hex_up - '0'));
        digit += (hex_low >= 'A' 
                ? ((hex_low & 0xdf- 'A'+ 10 : (hex_low - '0'));
        return (digit);
}
char *qURLdecode(char *str) 
{
        int i, j;
 
        if(!str) return NULL;
 
        for(i = j = 0; str[j]; i++, j++
        {
                switch(str[j]) 
                {
                case '+':
                        str[i] = ' ';
                        break;
 
                case '%':
                        str[i] = _x2c(str[j + 1], str[j + 2]);
                        j += 2;
                        break;
 
                default:
                        str[i] = str[j];
                        break;
                }
        }
        str[i]='';
 
        return str;
}
char *qURLencode(char *str) 
{
        char *encstr, buf[2+1];
        unsigned char c;
        int i, j;
 
        if(str == NULLreturn NULL;
        if((encstr = (char *)malloc((strlen(str) * 3+ 1)) == NULL
                return NULL;
 
        for(i = j = 0; str[i]; i++
        {
                c = (unsigned char)str[i];
                if((c >= '0') && (c <= '9')) encstr[j++= c;
                else if((c >= 'A') && (c <= 'Z')) encstr[j++= c;
                else if((c >= 'a') && (c <= 'z')) encstr[j++= c;
                else if((c == '@'|| (c == '.'|| (c == '/'|| (c == '\\')
                        || (c == '-'|| (c == '_'|| (c == ':') ) 
                        encstr[j++= c;
                else 
                {
                        sprintf(buf, "%02x", c);
                        encstr[j++= '%';
                        encstr[j++= buf[0];
                        encstr[j++= buf[1];
                }
        }
        encstr[j] = '';
 
        return encstr;
}
 
cs


# 받은 문자열을 유니코드로 변경

넘어온 문자열은 UTF-8 이므로

UTF-8 -> Unicode로 변경하면 WCHAR로 문자열을 사용할 수 있다.

 

1
2
3
4
 
// UTF-8 -> Unicode
len = MultiByteToWideChar(CP_UTF8, 0, szDecodeParam, strlen(szDecodeParam), NULLNULL);
MultiByteToWideChar(CP_UTF8, 0, szDecodeParam, strlen(szDecodeParam), wzDecodeParam, nLen);


Comments