博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中英文url解码vc++源程序
阅读量:6513 次
发布时间:2019-06-24

本文共 2149 字,大约阅读时间需要 7 分钟。

本文主要讨论中文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 
#include
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;}

转载地址:http://awsfo.baihongyu.com/

你可能感兴趣的文章
TableStore: 海量结构化数据分层存储方案
查看>>
java SpringUtil获取bean
查看>>
赛门铁克开启“容灾即服务”时代
查看>>
复杂度归纳--小结
查看>>
跨越企业的“中等收入陷阱”
查看>>
luogu P1280 尼克的任务 序列DP
查看>>
sys.check_constraints
查看>>
#define WIN32_LEAN_AND_MEAN 的作用
查看>>
仿余额宝数字跳动效果 TextCounter
查看>>
你必须知道的.net学习总结
查看>>
Axure8.0 网页 or App 鼠标滚动效果
查看>>
大家好,新年快乐。
查看>>
labview如何弹出提示窗口_LabVIEW开发者必读的问答汇总,搞定疑难杂症全靠它了!...
查看>>
jquery 乱码 传参_jquery获取URL中参数解决中文乱码问题的两种方法
查看>>
JDBC_MySQL_jdbc连接mysql_MySQL
查看>>
linux不能访问80端口,lunux开放80端口(本地访问不了linux文件可能是这个原因)...
查看>>
android单位转换小程序,微信小程序中rpx与rem单位转换
查看>>
ps切图教程 android,PS前端切图完整教程
查看>>
HTML如何把输入框变成必填值,required输入框为必填项
查看>>
背锅侠逆袭之路
查看>>