VC实现URL编解码器
//变化UTF8为了中国 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; } //解析URL //输入:"/apps/%E6%BB%B4%E6%BB%B4%E6%89%93%E8%BD%A6.apk" //输出: "/apps/嘀嘀打车.apk" //方法: 分下面两步实现 //先调用DecodeUrl(),得到"/apps/婊存淮鎵撹溅.apk" //再调用UTF8ToGB(),得到"/apps/嘀嘀打车.apk" BOOL DecodeUrl(char *pURL, char *szBuff, int nBuffLen) { if (NULL == szBuff || NULL == pURL) { return FALSE; } if (nBuffLen == 0) { return FALSE; } char *p = pURL; // 用来循环 int i = 0; // i用来控制szBuff数组 /* 暂时保存szBuff编码的数据 比如: %1A%2B%3C */ char t = '\0'; while (*p != '\0' && nBuffLen--) { if (*p == 0x25) // 0x25 = '%' { //下面是十六进制数中常出现的大写字母,小写字母,数字的推断 if (p[1] >= 'A' && p[1] <= 'Z') //大写字母 { t = p[1] - 'A' + 10; //A = 10,下同 } else if (p[1] >= 'a' && p[1] <= 'z') //小写字母 { t = p[1] - 'a' + 10; } else if (p[1] >= '0' && p[1] <= '9') //数字 { t = p[1] - '0'; } t *= 16; // 将数放到十位上去 if (p[2] >= 'A' && p[2] <= 'Z') //大写字母 { t += p[2] - 'A' + 10; } else if (p[2] >= 'a' && p[2] <= 'z') //小写字母 { t += p[2] - 'a' + 10; } else if (p[2] >= '0' && p[2] <= '9') //数字 { t += p[2] - '0'; } //到此合成了一个十六进制数 szBuff[i] = t; p += 3, i++; } else { //没有被url编码的数据 //'+'特殊处理.它相当于一个空格 if (*p != '+') { szBuff[i] = *p; } else { szBuff[i] = 0x20; } i++; p++; } } szBuff[i] = '\0'; //终结者 return TRUE; }
版权声明:本文博客原创文章。博客,未经同意,不得转载。