URLEncodeとURLDecodeの総括と実現
12257 ワード
URLEncode:URL文字列を符号化するために使用され、数字とアルファベットは変わらず、スペースは'+'になり、その他(例えば:中国語文字)はまず16進数表示に変換され、その後、バイトごとに識別子%が加算されます.例えば、「あ」字Asciiの16進数は0 xB 0 A 1です.->%B 0%A 1
コード実装:
URLDecode:符号化されたURL文字列を復号するために使用され、復号方式はURLEncodeとは逆である
コード実装:
コード実装:
1 unsigned char CHAR_TO_HEX( unsigned char ch )
2 {
3 //0xa(10) 'A'(65), 55 //0x0(0) '0'(48), 48
4 return (unsigned char)(ch > 9 ? ch + 55: ch + 48);
5 }
6
7 std::string URLEncode(const char* pSrc)
8 {
9 unsigned char chTemp;
10 std::string strDest;
11
12 while (*pSrc)
13 {
14 chTemp = (unsigned char)*pSrc;
15 if ( (chTemp >= 'a' && chTemp <= 'z') || (chTemp >= 'A' && chTemp <= 'Z') || (chTemp >= '0' && chTemp <= '9')
16 || strchr("-_.!~*'()", chTemp))
17 {
18 strDest += chTemp;
19 }
20 else if (chTemp == ' ')
21 {
22 *pDest++ = '+';
23 }
24 else
25 {
26 strDest += '%';
27 strDest += CHAR_TO_HEX( (unsigned char)(chTemp >> 4) );
28 strDest += CHAR_TO_HEX( (unsigned char)(chTemp & 0x0f) );
29 }
30 ++pSrc;
31 }
32
33 return strDest;
34 }
URLDecode:符号化されたURL文字列を復号するために使用され、復号方式はURLEncodeとは逆である
コード実装:
1 unsigned char* URLDecode(unsigned char* pSrc, std::string &strDest)
2 {
3 char szTemp[2];
4
5 while (*pSrc)
6 {
7 memset(szTemp, '/0', 2 );
8 if( *pSrc != '%' && *pSrc != ' ')
9 {
10 strDest += *pSrc++;
11 continue;
12 }
13 else if( *pSrc == ' ' )
14 {
15 strDest += '+';
16 continue;
17 }
18 // %
19 ++pSrc;
20 unsigned char cTmp = 0;
21
22 for (int k = 0; k < 2 && *pSrc; ++k, ++pSrc) // : %3f ---> 0x3f
23 {
24 if(*pSrc <= '9')//0x30~0x39
25 {
26 cTmp |= (*pSrc & 0x0f) << (1 - k) * 4;
27 }
28 else if(*pSrc >= 'a')//0x61~7a
29 {
30 cTmp |= (*pSrc - 0x57) << (1 - k) * 4;
31 }
32 else//0x41~5a
33 {
34 cTmp |= (*pSrc - 0x37) << (1 - k) * 4;
35 }
36 }
37 strDest += cTmp;
38 }
39 return 0;
40 }