转载——http://blog.163.com/zhangjie_0303/blog/static/9908270620148251658993/
 
#include <iostream>
#include <stdlib.h>
#include <string.h>
 
using namespace std;
 
typedef unsigned char BYTE;  
   
    inline BYTE toHex(const BYTE &x)  
    {  
        return x > 9 ? x -10 + 'A': x + '0';  
    }  
  
    inline BYTE fromHex(const BYTE &x)  
    {  
        return isdigit(x) ? x-'0' : x-'A'+10;  
    }  
   
    inline string URLEncode(const string &sIn)  
    {  
        string sOut;  
        for( size_t ix = 0; ix < sIn.size(); ix++ )  
        {        
            BYTE buf[4];  
            memset( buf, 0, 4 );  
            if( isalnum( (BYTE)sIn[ix] ) )  
            {        
                buf[0] = sIn[ix];  
            }  
            //else if ( isspace( (BYTE)sIn[ix] ) ) //貌似把空格编码成%20或者+都可以  
            //{  
            //    buf[0] = '+';  
            //}  
            else  
            {  
                buf[0] = '%';  
                buf[1] = toHex( (BYTE)sIn[ix] >> 4 );  
                buf[2] = toHex( (BYTE)sIn[ix] % 16);  
            }  
            sOut += (char *)buf;  
        }  
        return sOut;  
    };  
  
    inline string URLDecode(const string &sIn)  
    {  
        string sOut;  
        for( size_t ix = 0; ix < sIn.size(); ix++ )  
        {  
            BYTE ch = 0;  
            if(sIn[ix]=='%')  
            {  
                ch = (fromHex(sIn[ix+1])<<4);  
                ch |= fromHex(sIn[ix+2]);  
                ix += 2;  
            }  
            else if(sIn[ix] == '+')  
            {  
                ch = ' ';  
            }  
            else  
            {  
                ch = sIn[ix];  
            }  
            sOut += (char)ch;  
        }  
        return sOut;  
    }  
 
/*int main(int argc, char** argv)
{
        string test_str1 = "老同学";
        //string test_str2 = URLEncode(test_str1);
        string test_str2 = "%89%E6%B1%89%E6%B1%89";
        cout << "test_str2=" << test_str2 <<endl;
        string test_str3 = URLDecode(test_str2);
        cout << "test_str3=" << test_str3 <<endl;
        return 0;
}*/

C++ URLDecode和URLEncode实现——仅限gb2312,非utf8的更多相关文章

  1. HTC仅限拨打紧急电话

    问题描述: 我手上有台 HTC One V 没碰没撞,突然打不出电话,信号上显示一个叉,屏幕上显示“仅限拨打紧急电话” 解决办法:经百度,原来很多HTC机子都有这种情况,幸好不是硬件坏了,只需按以下步 ...

  2. 真正的手机破解wifi密码,aircrack-ng,reaver,仅限mx2(BCM4330芯片)

    仅限mx2(BCM4330芯片),mx可能有戏没测试(BCM4329?),mx3不行. PS:原生安卓应用,非虚拟机 reaver,不知道是啥的看这里http://tieba.baidu.com/p/ ...

  3. bayaim_mysql_忘记密码 [仅限 5.6以下]

    bayaim_mysql_忘记密码 [仅限 5.6以下] 原创 作者:bayaim 时间:2017-12-26 10:47:41 8 0删除编辑 忘记root密码------------------- ...

  4. 转载:从程序员的角度看ASCII, GB2312, UNICODE, UTF-8

    以下内容转自博客:http://blog.chinaunix.net/uid-22670933-id-1771613.html. 一.字符编码是怎么回事 0. 概念 字节是计算机的最基本存储单位,一个 ...

  5. C#获取文本文件的编码,自动区分GB2312和UTF8

    C# 获取文本文件的编码,自动区分GB2312和UTF8 以下是获取文件编码的一个类 using System; using System.IO; using System.Text; /// < ...

  6. javascript GB2312转UTF8

    /* * GB2312转UTF8 * 例: * var xx=new GB2312UTF8(); * var Utf8=xx.Gb2312ToUtf8("你aaa好aaaaa"); ...

  7. 使用iconv进行编码gb2312转utf8 转码失败的坑

    iconv 编码gb2312转utf8 转码失败的坑 使用背景 项目中使用thrift进行C#程序调用c++接口,其中的协议是通过json进行传输的,由于默认thrift使用utf8进行传输,而C#和 ...

  8. MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据 ...

  9. ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE

    http://www.chinaz.com/web/2012/1119/282540.shtml 编码一直是让新手头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别, ...

随机推荐

  1. 关于UIScollView 中的contentOffset 的理解

    大家对UIScollView 中的contentOffset 一直有疑问, 虽然看是一个简单的问题, 实际上并不简单. 当时我也有好多疑问, 后来在网上找了一下资料, 发现没有找到合理的解释, 因此自 ...

  2. 基于Ruby的watir-webdriver自动化测试方案与实施(四)

    接着基于Ruby的watir-webdriver自动化测试方案与实施(三) http://www.cnblogs.com/Javame/p/4159468.html 继续 ... ...   首先回忆 ...

  3. 数据仓库之启用cdc

    准备工作: 先将sqlservere 代理服务启动 USE [MyDB]; GO EXECUTE sys.sp_cdc_enable_db; --启用数据库对CDC的支持 GO -- 设置别名 @ca ...

  4. SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享

    这个问题是在SQL SERVER 2005 升级到SQL SERVER 2014的测试过程中一同事发现的.我觉得有点意思,遂稍微修改一下脚本展示出来,本来想构造这样的一个案例来演示,但是畏惧麻烦,遂直 ...

  5. 【ASM】ASMSNMP用户已存在

    [ASM]ASMSNMP用户已存在 During Oracle Grid Infrastructure for a cluster installation, the ASMSNMP account ...

  6. Ubuntu nginx 配置404错误页面

    1.创建自己的404.html页面: 2.更改nginx.conf在http定义区域加入: /etc/nginx# vim nginx.conf 下添加 fastcgi_intercept_error ...

  7. Windows10 会不会成为微软的新起点?

    Because if you change the way you see the world, you can change the world you see. 如果你改变看世界的方式,你就能改变 ...

  8. MongoDb 创建、更新以及删除文档常用命令

    mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, o ...

  9. C# 扩展方法集

    语法注意点 可以使用扩展方法来扩展类或接口. 不能重写扩展方法. 扩展方法只能在非嵌套.非泛型静态类内部定义. 扩展方法必须定义在静态类中. 扩展方法的第一个参数的类型用于指定被扩展的类型,它限制该扩 ...

  10. 【WPF系列】-TextBox常用知识点

    DataBinding中更新数据源的时机   TextBox .Text 属性的默认 UpdateSourceTrigger 值为 LostFocus.这意味着如果应用程序的 TextBox 包含数据 ...