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;
}
则完成了