http url 请求

来源:互联网 发布:银行卡卡号生成软件 编辑:程序博客网 时间:2024/05/17 03:54

http  也存在着不同的编码 查看网站源码就会发现

1、charset=gb2312

在GB2312编码中 每个汉字都及符号都是用两个字节来表示。第一个字节 成为“高字节” 第二个字节成为高字节

所以在 当使用GB2312编码 传递中文参数 就需要对中文进行编码 。 c++

string strCoding::UrlGB2312(char * str)  {      string dd;      size_t len = strlen(str);      for (size_t i=0;i<len;i++)      {          if(isalnum((BYTE)str[i]))                              //判断是否是字母或者数字        {              char tempbuff[2];                                  //字母或者数字 不改变            sprintf(tempbuff,"%c",str[i]);              dd.append(tempbuff);          }          else if (isspace((BYTE)str[i]))                          //判断是否空格        {              dd.append("%20");                                     //空格使用%20代替        }          else          {              char tempbuff[4];                                                        sprintf(tempbuff,"%%%X%X",((BYTE*)str)[i] >>4,((BYTE*)str)[i] %16);      //向右移动 四位获得高四位 高字节  摸上16去的后四位作为低字节     需要出现%  所以 要2个%%            dd.append(tempbuff);          }        }      return dd;  }  
2、charset=UTF-8

表示该网页使用的是UTF-8的字符集

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码

用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)

基本思想就是 英语字符 数字不变 空格变成+ 汉字变成三字节  

string strCoding::UrlUTF8(char * str)  {      string tt;      string dd;      GB2312ToUTF_8(tt,str,(int)strlen(str));        size_t len=tt.length();      for (size_t i=0;i<len;i++)      {          if(isalnum((BYTE)tt.at(i)))          {              char tempbuff[2]={0};              sprintf(tempbuff,"%c",(BYTE)tt.at(i));              dd.append(tempbuff);          }          else if (isspace((BYTE)tt.at(i)))          {              dd.append("+");          }          else          {              char tempbuff[4];              sprintf(tempbuff,"%%%X%X",((BYTE)tt.at(i)) >>4,((BYTE)tt.at(i)) %16);              dd.append(tempbuff);          }        }      return dd;  } 

将GB2312 转换成UTF-8

void strCoding::GB2312ToUTF_8(string& pOut,char *pText, int pLen)  {      char buf[4];      memset(buf,0,4);        pOut.clear();        int i = 0;      while(i < pLen)      {          //如果是英文直接复制就可以          if( pText[i] >= 0)          {              char asciistr[2]={0};              asciistr[0] = (pText[i++]);              pOut.append(asciistr);          }          else          {              WCHAR pbuffer;              Gb2312ToUnicode(&pbuffer,pText+i);                UnicodeToUTF_8(buf,&pbuffer);                pOut.append(buf);                i += 2;          }      }        return;  }  


void strCoding::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer){    ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);    return;}

void strCoding::UTF_8ToUnicode(WCHAR* pOut,char *pText){    char* uchar = (char *)pOut;         uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);    uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);    return;}


则完成了



0 0