本文主要讨论中文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. 【C语言探索之旅】 第二部分第一课:模块化编程

    内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...

  2. IE6浏览器的一些问题

    背景图像缓存 // IE6 background image caching fix. try { document.execCommand("BackgroundImageCache&qu ...

  3. vs2015基于VisualStudioOnline协同工作流程

    项目负责人登陆自己的vsonline新建项目就不多说了. 直接从邀请队友开始 项目负责人操作 被邀请的邮箱务必是可以登录visualstudio的邮箱 发送邀请后,被邀请人登陆自己的邮箱,查看邀请人发 ...

  4. MSSQL基础

    前言 最近看到一些关于sql的汇总博客,觉得还是很不错的.于是心血来潮,也想写一篇自己对这方面的一些认识(主要是点出一下自己比较少用demo写的,一般都是直接改设计时的,例如建表.该字段名). 一.数 ...

  5. 关于“类不能支持Automation操作”错误的解决方法

    一段程序IE上老是提示“类不支持Automation操作”的错误,IE6.7.8都一样,但是Firefox可以,后来网上找到如下解决方法: 重新注册下以下文件,问题便解决了:msscript.ocxd ...

  6. Delete和Truncate的区别

    原文:Delete和Truncate的区别 一般对于没有用的数据,都会经行删除,而删除通常使用的是DELETE和TRUNCATE命令.对于有条件地删除,基本上就会使用DELETE,当然还是没有绝对,用 ...

  7. Ping azure

    最近azure在虚拟机上打开(欧式世纪互联),这其实并不能ping虚拟机! 查了一下资料,发现azure不支持被ping这个功能(貌似是不开放ICMP-in这个协议).有些用户跟客服问过这个问题,可是 ...

  8. css3 翻牌(rotate) 以及翻转 导致边缘锯齿解决 方法

     主要知识点:rotate旋转以及  outline透明的像素消除(明显降低)火狐旋转是产生的 锯齿  首先看结构: <li class="flip-container " ...

  9. OpenWrt配置opkg.conf

    傻人干活才累. 用openwrt有一年多了, 数据传输一直使用wget从外部的webserver取. 这样的方法我个人认为还算轻松. 可是调试的多了,写大型一点的程序,总是这样就有点麻烦了. 安装软件 ...

  10. [HAOI2005]路由问题,第二短路

    [问题描写叙述]     X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径.遗憾的是.因为种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点 ...