中英文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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。