中英文url解码vc++源程序

时间:2023-03-09 07:27:26
中英文url解码vc++源程序

本文主要讨论中文url解码实现问题,没有具体解说url编码,utf-8编码.想对编解码问题有更加具体的了解,请查阅相关文档

url编码:实质字符ascii码的十六进制。仅仅是略微有些变动,须要在前面加上"%"。比方"\",它的ascii码是92,92的十六进制是5c,所以"\"的url编码就是%5c。

UTF-8 编码是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。如今已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。假设UNICODE字符由2个字节表示,则编码成UTF-8非常可能须要3个字节,而假设UNICODE字符由4个字节表示,则编码成UTF-8可能须要6个字节。

这里我们仅仅须要知道utf-8对一个英文字符採用一个字节进行编码,对一个中文字符採用三个字节进行编码。如今对例如以下url编码进行解码实现。

url编码:MFC%E8%8B%B1%E6%96%87%E6%89%8B%E5%86%8C.chm

源码在windows xp sp2 + vc++6.0測试通过(改进过的代码)。

#include <afx.h>
#include <iostream>
void UTF8ToGB(CString& str); void ANSIToGB(char* str,int n)
{
ASSERT(str!=NULL); // 保证传进来的參数不能为NULL
wchar_t szwchar = 0;
CString szResult,szhead = "", szend = "";
CString szrst;
char ch, hex[2] = "";
int ix = 0;
szResult = str;
int imax = szResult.GetLength();
int ih = szResult.Find("%", 0);
int ie = szResult.ReverseFind('%');
szhead = szResult.Left(ih);
//szend = szResault.Right(imax - ie - 3);
szResult = "";
ix = ih;
CString strTemp;
bool bIsHaveUTF8 = false;
while (ch = *(str + ix))
{ if (ch == '%')
{
hex[0] = *(str + ix + 1);
hex[1] = *(str + ix + 2);
sscanf(hex, "%x", &szwchar);
szrst += szwchar;
ix+=3;
bIsHaveUTF8 = true;
}
else
{
if(bIsHaveUTF8)
{
UTF8ToGB(szrst);
strTemp+=szrst;
szrst="";
bIsHaveUTF8 = false;
}
// 取出不必转换的字符
strTemp += *(str + ix);
ix++;
}
} szResult = szhead + strTemp;
memset(str,0,n);
strcpy(str,szResult); } void UTF8ToGB(CString& szstr)
{
WCHAR* strSrc; TCHAR* szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, szstr, -1, NULL, 0);
strSrc = new WCHAR[i + 1]; MultiByteToWideChar(CP_UTF8, 0, szstr, -1, strSrc, i);
i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new TCHAR[i + 1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
szstr = szRes;
delete[]strSrc;
delete[]szRes;
} int main(int argc, char* argv[])
{
//str = "%E6%96%B0%E5%BB%BA";
char str[] = "MFC%E8%8B%B1%E6%96%87%E6%89%8B%E5%86%8C.chm"; // 注意,这里传给ANSIToGB的第一个參数一定不能是个常量字符串, // 由于ANSIToGB内部还要从第一个參数将结果返回 // 当然这些仅仅是细节,不值得斤斤计较,大家能够改动成自己合适的,比方,解码后的结果能够通过其它參数传出.... ANSIToGB(str,strlen(str)*sizeof(char));
printf("结果是:%s\n", str); return 0;
}