本文主要讨论中文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. sql server 数据库 只有mdf文件,如何附加

    直接附加就可以,SQL 会提示LOG文件找不到,可删除提示的错误行,只附加MDF文件,附加成功后,SQL会自动创建LOG文件.

  2. poj 3237 Tree(树链拆分)

    题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...

  3. RH033读书笔记(12)-Lab 13 Finding and Processing Files

    Sequence 1: Using find Scenario: Log in as user student. Devise and execute a find command that prod ...

  4. zoj 2156 - Charlie&#39;s Change

    称号:拼布钱,表面值至1,5.10.25.寻求组成n表面值硬币的最大数目. 分析:dp,01背包.需要二元分割,除此以外TLE.使用每个硬币的数组记录数.轻松升级. 写了一个 多重背包的 O(NV)反 ...

  5. LeetCode之Sort List

    称号:Sort a linked list in O(n log n) time using constant space complexity. 对一个单链表进行排序,要求时间复杂度为O(n log ...

  6. js中推断对象详细类型

    大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...

  7. POJ 3414--Pots(BFS+回溯路径)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9963   Accepted: 4179   Special Ju ...

  8. Swift学习 --- 2.3和字符串

    1.创建一个空字符串,并通过推理的字符串是空的 <span style="font-size:18px;"> var str = "" var st ...

  9. Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建(转)

    一.引言    本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于Intelli ...

  10. Hadoop0.20.2 Bloom filter应用演示样例

    1. 简单介绍 參见<Hadoop in Action>P102 以及 <Hadoop实战(第2版)>(陆嘉恒)P69 2. 案例 网上大部分的说明不过依照<Hadoop ...