一个URL编码和解码的C++类

来源:互联网 发布:易语言ip攻击器源码 编辑:程序博客网 时间:2024/05/16 06:13
  1. [cpp] view plain copy
    1. #pragma once  
    2.   
    3.   
    4. #include <iostream>  
    5. #include <string>  
    6. #include <windows.h>  
    7. using namespace std;  
    8.   
    9. class strCoding  
    10. {  
    11. public:  
    12.     strCoding(void);  
    13.     ~strCoding(void);  
    14.     
    15.     void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//utf_8转为gb2312  
    16.     void GB2312ToUTF_8(string& pOut,char *pText, int pLen); //gb2312 转utf_8  
    17.     string UrlGB2312(char * str);                           //urlgb2312编码  
    18.     string UrlUTF8(char * str);                             //urlutf8 编码  
    19.     string UrlUTF8Decode(string str);                  //urlutf8解码  
    20.     string UrlGB2312Decode(string str);                //urlgb2312解码  
    21.   
    22. private:  
    23.     void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer);  
    24.     void UTF_8ToUnicode(WCHAR* pOut,char *pText);  
    25.     void UnicodeToUTF_8(char* pOut,WCHAR* pText);  
    26.     void UnicodeToGB2312(char* pOut,WCHAR uData);  
    27.     char CharToInt(char ch);  
    28.     char StrToBin(char *str);  
    29.   
    30. };  
    31.   
    32. #include "StdAfx.h"  
    33. #include ".\urlcodeing.h"  
    34. //这是个类strCoding (strCoding.cpp文件)  
    35.   
    36. strCoding::strCoding(void)  
    37. {  
    38. }  
    39.   
    40. strCoding::~strCoding(void)  
    41. {  
    42. }  
    43. void strCoding::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer)  
    44. {  
    45.     ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);  
    46.     return;  
    47. }  
    48. void strCoding::UTF_8ToUnicode(WCHAR* pOut,char *pText)  
    49. {  
    50.     char* uchar = (char *)pOut;  
    51.       
    52.     uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);  
    53.     uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);  
    54.   
    55.     return;  
    56. }  
    57.   
    58. void strCoding::UnicodeToUTF_8(char* pOut,WCHAR* pText)  
    59. {  
    60.     // 注意 WCHAR高低字的顺序,低字节在前,高字节在后  
    61.     char* pchar = (char *)pText;  
    62.   
    63.     pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));  
    64.     pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);  
    65.     pOut[2] = (0x80 | (pchar[0] & 0x3F));  
    66.   
    67.     return;  
    68. }  
    69. void strCoding::UnicodeToGB2312(char* pOut,WCHAR uData)  
    70. {  
    71.     WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);  
    72.     return;  
    73. }  
    74.   
    75. //做为解Url使用  
    76. char strCoding:: CharToInt(char ch){  
    77.         if(ch>='0' && ch<='9')return (char)(ch-'0');  
    78.         if(ch>='a' && ch<='f')return (char)(ch-'a'+10);  
    79.         if(ch>='A' && ch<='F')return (char)(ch-'A'+10);  
    80.         return -1;  
    81. }  
    82. char strCoding::StrToBin(char *str){  
    83.         char tempWord[2];  
    84.         char chn;  
    85.   
    86.         tempWord[0] = CharToInt(str[0]);                         //make the B to 11 -- 00001011  
    87.         tempWord[1] = CharToInt(str[1]);                         //make the 0 to 0 -- 00000000  
    88.   
    89.         chn = (tempWord[0] << 4) | tempWord[1];                //to change the BO to 10110000  
    90.   
    91.         return chn;  
    92. }  
    93.   
    94.   
    95. //UTF_8 转gb2312  
    96. void strCoding::UTF_8ToGB2312(string &pOut, char *pText, int pLen)  
    97. {  
    98.      char buf[4];  
    99.      char* rst = new char[pLen + (pLen >> 2) + 2];  
    100.     memset(buf,0,4);  
    101.     memset(rst,0,pLen + (pLen >> 2) + 2);  
    102.   
    103.     int i =0;  
    104.     int j = 0;  
    105.        
    106.     while(i < pLen)  
    107.     {  
    108.         if(*(pText + i) >= 0)  
    109.         {  
    110.              
    111.             rst[j++] = pText[i++];  
    112.         }  
    113.         else                  
    114.         {  
    115.             WCHAR Wtemp;  
    116.   
    117.              
    118.             UTF_8ToUnicode(&Wtemp,pText + i);  
    119.                
    120.             UnicodeToGB2312(buf,Wtemp);  
    121.              
    122.             unsigned short int tmp = 0;  
    123.             tmp = rst[j] = buf[0];  
    124.             tmp = rst[j+1] = buf[1];  
    125.             tmp = rst[j+2] = buf[2];  
    126.   
    127.             //newBuf[j] = Ctemp[0];  
    128.             //newBuf[j + 1] = Ctemp[1];  
    129.   
    130.             i += 3;     
    131.             j += 2;    
    132.         }  
    133.          
    134. }  
    135.     rst[j]='\0';  
    136.    pOut = rst;  
    137.     delete []rst;  
    138. }  
    139.   
    140. //GB2312 转为 UTF-8  
    141. void strCoding::GB2312ToUTF_8(string& pOut,char *pText, int pLen)  
    142. {  
    143.     char buf[4];  
    144.     memset(buf,0,4);  
    145.   
    146.     pOut.clear();  
    147.   
    148.     int i = 0;  
    149.     while(i < pLen)  
    150.     {  
    151.         //如果是英文直接复制就可以  
    152.         if( pText[i] >= 0)  
    153.         {  
    154.             char asciistr[2]={0};  
    155.             asciistr[0] = (pText[i++]);  
    156.             pOut.append(asciistr);  
    157.         }  
    158.         else  
    159.         {  
    160.             WCHAR pbuffer;  
    161.             Gb2312ToUnicode(&pbuffer,pText+i);  
    162.   
    163.             UnicodeToUTF_8(buf,&pbuffer);  
    164.   
    165.             pOut.append(buf);  
    166.   
    167.             i += 2;  
    168.         }  
    169.     }  
    170.   
    171.     return;  
    172. }  
    173. //把str编码为网页中的 GB2312 url encode ,英文不变,汉字双字节 如%3D%AE%88  
    174. string strCoding::UrlGB2312(char * str)  
    175. {  
    176.     string dd;  
    177.     size_t len = strlen(str);  
    178.     for (size_t i=0;i<len;i++)  
    179.     {  
    180.         if(isalnum((BYTE)str[i]))  
    181.         {  
    182.             char tempbuff[2];  
    183.             sprintf(tempbuff,"%c",str[i]);  
    184.             dd.append(tempbuff);  
    185.         }  
    186.         else if (isspace((BYTE)str[i]))  
    187.         {  
    188.             dd.append("+");  
    189.         }  
    190.         else  
    191.         {  
    192.             char tempbuff[4];  
    193.             sprintf(tempbuff,"%%%X%X",((BYTE*)str)[i] >>4,((BYTE*)str)[i] %16);  
    194.             dd.append(tempbuff);  
    195.         }  
    196.   
    197.     }  
    198.     return dd;  
    199. }  
    200.   
    201. //把str编码为网页中的 UTF-8 url encode ,英文不变,汉字三字节 如%3D%AE%88  
    202.   
    203. string strCoding::UrlUTF8(char * str)  
    204. {  
    205.     string tt;  
    206.     string dd;  
    207.     GB2312ToUTF_8(tt,str,(int)strlen(str));  
    208.   
    209.     size_t len=tt.length();  
    210.     for (size_t i=0;i<len;i++)  
    211.     {  
    212.         if(isalnum((BYTE)tt.at(i)))  
    213.         {  
    214.             char tempbuff[2]={0};  
    215.             sprintf(tempbuff,"%c",(BYTE)tt.at(i));  
    216.             dd.append(tempbuff);  
    217.         }  
    218.         else if (isspace((BYTE)tt.at(i)))  
    219.         {  
    220.             dd.append("+");  
    221.         }  
    222.         else  
    223.         {  
    224.             char tempbuff[4];  
    225.             sprintf(tempbuff,"%%%X%X",((BYTE)tt.at(i)) >>4,((BYTE)tt.at(i)) %16);  
    226.             dd.append(tempbuff);  
    227.         }  
    228.   
    229.     }  
    230.     return dd;  
    231. }  
    232. //把url GB2312解码  
    233. string strCoding::UrlGB2312Decode(string str)  
    234. {  
    235.    string output="";  
    236.         char tmp[2];  
    237.         int i=0,idx=0,ndx,len=str.length();  
    238.          
    239.         while(i<len){  
    240.                 if(str[i]=='%'){  
    241.                         tmp[0]=str[i+1];  
    242.                         tmp[1]=str[i+2];  
    243.                         output += StrToBin(tmp);  
    244.                         i=i+3;  
    245.                 }  
    246.                 else if(str[i]=='+'){  
    247.                         output+=' ';  
    248.                         i++;  
    249.                 }  
    250.                 else{  
    251.                         output+=str[i];  
    252.                         i++;  
    253.                 }  
    254.         }  
    255.          
    256.         return output;  
    257. }  
    258. //把url utf8解码  
    259. string strCoding::UrlUTF8Decode(string str)  
    260. {  
    261.      string output="";  
    262.   
    263.     string temp =UrlGB2312Decode(str);//  
    264.   
    265.     UTF_8ToGB2312(output,(char *)temp.data(),strlen(temp.data()));  
    266.   
    267.     return output;  
    268.   
    269. }  
0 0
原创粉丝点击