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

中英文url解码vc++源程序的更多相关文章

  1. 快速解码base64和utf-8的ASCII编码和URL解码

    看论坛上总是有人发乱七八糟的文字,根本看不懂,用下面的方法解密一下. 只要有浏览器的开发者工具就行了. UTF-16解码 console.log("\u5475\u5475") U ...

  2. 关于URL 解码, 编码

    由于近期客户需要用到CA认证,此CA认证采用的是URL方式出传值 使用指定的编码对象将 URL 编码的字符串转换为已解码的字符串. 编码个人理解就是将某字符串以某种方式储存起来,而解码则以其编码格式得 ...

  3. 【好程序员笔记分享】——URL解码与编码

    -iOS培训,iOS学习-------型技术博客.期待与您交流!------------ 1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * ...

  4. loadrunner 脚本开发-url解码

    url解码 by:授客 QQ:1033553122 脚本结构如下: Action.c中的代码如下: int htoi(char *s) { int value = 0; int c = 0; c = ...

  5. 串口调试助手vc源程序及其详细编写过程

    串口调试助手vc源程序及其详细编写过程   目次: 1.建立项目 2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量 4.在对话框中添加控件 5.添加串口事件 ...

  6. url解码

    最近在做流量分析的项目.需要将url解码.写了个代码,先存一下,有时间再仔细写写. #include <stdio.h> #include <stdlib.h> #includ ...

  7. Python3 url解码与参数解析

    Python3 url解码与参数解析 有些子节点名字直接就是编码后的url,就像下面这行一样: url='dubbo%3A%2F%2F10.4.5.3%3A20880%2Fcom.welab.auth ...

  8. Url解码和编码 escape()、encodeURI()、encodeURIComponent()区别详解

    Server.UrlDecode;解码 Server.UrlEncode;编码 url编码是一种浏览器用来打包表单输入的格式.浏览器从表单中获取所有的name和其中的值 ,将它们以name/value ...

  9. c# 对Url 解码编码

    /// <summary> /// 对Url进行编码 /// </summary> /// <param name="url">url</ ...

随机推荐

  1. Android Stuido怎样查看快捷键冲突?

    看了这篇文章Android Studio怎样查看资源或者函数在哪些类中被引用.知道了快捷键失效的原因,当中有一个原因就是快捷键冲突.那怎样查看快捷键哪些项冲突了呢? Android Studio要查看 ...

  2. oracle dblink造成远程数据库session过多

    现场报网公司数据库连不上,先检查了下数据库processes=1500,session=2200.我认为非常大啊.这个数据库没有几个人用. 查看v$session中的session最多是哪个machi ...

  3. PDO基本操作Mysql

    来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/805 PHP中的PDO扩展为PHP訪问数据库定义了一个轻量级的.一致性的接口.它提供了一个数据 ...

  4. zend studio 安装emmet(zen coding)

    help->Install New Software 在work with后面点击Add,弹出的对话框中填写信息: Name:随意 Location:http://emmet.io/eclips ...

  5. Windowsport80解决方案被占用

    今天,在一个非常沮丧的实施Server什么时候,一个错误port80占用.因此,找到一种方法来解决各类.最后,我的解决方案列出的问题来,要遇到的人做一些参考同样的问题. 第一步,找出哪些程序正在使用p ...

  6. SQL Server 索引列的顺序——真的没关系吗

    原文:SQL Server 索引列的顺序--真的没关系吗 翻译自:http://www.mssqltips.com/sqlservertip/2718/sql-server-index-column- ...

  7. Android 按下电源按钮关闭小学习过程的整个长度

    Android 按下电源按钮关闭小学习过程的整个长度 近期研究了一下android关机跟又一次启动功能,看了一些长按电源键到弹出关机对话框,到真正关机的一系列处理过程. 首先还是来看看这个长按电源键都 ...

  8. hibernate在地图的方法之一协会

    [Hibernate]之关于多对一单向关联映射 在项目的开发中多对一的单向关联映射是最常见的关联映射! 这个着重具体解说一下! 比如,我们如今一个组(Group)和人(Person) id name ...

  9. nisi 脚本示例

    只是简单的copy文件和添加快捷方式,安装和卸载时对程序是否运行进行检测 ;-------------------------------- ;Include Modern UI !include & ...

  10. UVA714- Copying Books(最大最小化)

    意甲冠军:k手稿的部分成m部分,使每一个和最小 思路:典型最大值最小化问题,使用贪心+二分. 贪心的是每次尽量将元素往右边划分,二分查找最小的x满足m个连续的子序列和S(i)都不超过x. 由于输出的原 ...