URL编解码
2015-06-18 05:56
507 查看
//URL编码 BSTR URLEncode(LPCSTR srcURL, UINT CodePage = CP_ACP) { BSTR bstrVal = NULL; int iWchLen=0, iUtf8Len=0, iEncLen = 0; wchar_t *wchBuff = NULL; char *utf8Buff = NULL; char *encURL = NULL; unsigned char chV, chH, chL; //先转换成UNICODE iWchLen = ::MultiByteToWideChar(CodePage, 0, srcURL, -1, NULL, 0); wchBuff = (wchar_t *)_alloca((iWchLen+1)*sizeof(wchar_t)); ::MultiByteToWideChar(CodePage, 0, srcURL, -1, wchBuff, iWchLen); //转成UTF8 iUtf8Len = ::WideCharToMultiByte(CP_UTF8, 0, wchBuff, -1, NULL, 0, NULL, NULL); utf8Buff = (char*)_alloca(iUtf8Len+1); ::WideCharToMultiByte(CP_UTF8, 0, wchBuff, -1, utf8Buff, iUtf8Len, NULL, NULL); //编码 (将非ASC码转换成%HH的十六进制字符) iEncLen = 0; encURL = (char *)_alloca(iUtf8Len * 3 + 1); while((chV = (unsigned char)*utf8Buff++) != 0) { if(chV > 0x20 && chV < 0x7F) //ASCII { encURL[iEncLen++] = chV; } else { chH = chV>>4, chL = chV & 0x0F; encURL[iEncLen++] = '%'; encURL[iEncLen++] = chH >= 10 ? (chH - 10 + 'A'):(chH - 0 + '0'); encURL[iEncLen++] = chL >= 10 ? (chL - 10 + 'A'):(chL - 0 + '0'); } } encURL[iEncLen] = 0; //结束符 printf("SrcURL:%s\nUnicode:%s\nUtf8:%s\nencURL:%s\n", srcURL, wchBuff, utf8Buff, encURL); bstrVal = _bstr_t(encURL); return bstrVal; } //URL解码 BSTR URLDecode(LPCSTR srcURL, UINT CodePage = CP_ACP) { BSTR bstrVal = NULL; int iWchLen=0, iUtf8Len=0, iDecLen = 0; wchar_t *wchBuff = NULL; char *utf8Buff = NULL; char *decURL = NULL; unsigned char chV, chH, chL; //解码 (转换%HH的十六进制字符) iUtf8Len = 0; utf8Buff = (char*)_alloca(strlen(srcURL) + 1); while((chV = (unsigned char)*srcURL++) != 0) { if(chV == '%') { chH = *srcURL++; if(chH >= '0' && chH <= '9') chH -= '0'; else if(chH >= 'A' && chH <= 'F') chH = chH - 'A' + 10; else if(chH >= 'a' && chH <= 'f') chH = chH - 'a' + 10; else chH = 0; chL = *srcURL++; if(chL >= '0' && chL <= '9') chL -= '0'; else if(chL >= 'A' && chL <= 'F') chL = chL - 'A' + 10; else if(chL >= 'a' && chL <= 'f') chL = chL - 'a' + 10; else chL = 0; chV = (chH <<4) | chL; } utf8Buff[iUtf8Len++] = chV; } utf8Buff[iUtf8Len] = 0; //结束符 //换成UNICODE iWchLen = ::MultiByteToWideChar(CP_UTF8, 0, utf8Buff, -1, NULL, 0); wchBuff = (wchar_t *)_alloca((iWchLen+1)*sizeof(wchar_t)); ::MultiByteToWideChar(CP_UTF8, 0, utf8Buff, -1, wchBuff, iWchLen); //转成CP_ACP iDecLen = ::WideCharToMultiByte(CodePage, 0, wchBuff, -1, NULL, 0, NULL, NULL); decURL = (char*)_alloca(iDecLen+1); ::WideCharToMultiByte(CodePage, 0, wchBuff, -1, decURL, iDecLen, NULL, NULL); printf("SrcURL:%s\nUtf8:%s\nUnicode:%s\ndecURL:%s\n", srcURL, utf8Buff, wchBuff, decURL); bstrVal = _bstr_t(decURL); return bstrVal; }
void TestURLEndDec() { LPCSTR srcURL = "http://www.oschina.net/search?scope=bbs&q=C语言"; _bstr_t encURL = URLEncode(srcURL); _bstr_t decURL = URLDecode(encURL); }
相关文章推荐
- 使用ImageMagick 在图片上绘制粗斜体的中文也许是一个错误。
- 收藏:IPicture总结
- MFC:ID命名和数字约定
- 在c语言中嵌入汇编语句,对于我来说相当难。
- 学习在dos下使用gcc来编译
- Win32+API学习笔记:创建基本的窗口控件
- 收藏:Windows消息机制
- 收藏:Win32消息机制
- isspace 对含有中文 的字符串进行检查的时候表现不正常!?
- 致自己以及关心自己的人
- 自己假设服务器做虚拟主机商
- Visual Studio Code 0.3.0 版试用体验
- 解决eclipse中overlaps the location of another project: 'xxxx'
- C++中使用std::regex提取lrc歌词文件
- 规划及体育可以
- Sublime Text2 取消打开时弹出升级到新版本的提示
- LNMP环境搭建
- 天题系列: Shortest Palindrome
- 探秘空值位图掩码(NULL bitmap mask)
- “四则运算解剖” 报告