(C++)UrlEncode的标准实现

关于UrlEncode的实现(C++),网上有很多不同的版本,对需要编码的字符集的选取并不统一。那么到底有没有标准呢?答案是有的,参见wiki

绝对不编码的,只有字母、数字、短横线(-)、下划线(_)、点(.)和波浪号(~),其他字符要视情况而定,所以一般性的urlencode只需保留上述字符不进行编码。

下面给出实现:

    unsigned char ToHex(unsigned char x)
    {
        return  x > 9 ? x + 55 : x + 48;
    }  

    unsigned char FromHex(unsigned char x)
    {
        unsigned char y;
        if (x >= ‘A‘ && x <= ‘Z‘) y = x - ‘A‘ + 10;
        else if (x >= ‘a‘ && x <= ‘z‘) y = x - ‘a‘ + 10;
        else if (x >= ‘0‘ && x <= ‘9‘) y = x - ‘0‘;
        else assert(0);
        return y;
    }  

    std::string UrlEncode(const std::string& str)
    {
        std::string strTemp = "";
        size_t length = str.length();
        for (size_t i = 0; i < length; i++)
        {
            if (isalnum((unsigned char)str[i]) ||
                (str[i] == ‘-‘) ||
                (str[i] == ‘_‘) ||
                (str[i] == ‘.‘) ||
                (str[i] == ‘~‘))
                strTemp += str[i];
            else if (str[i] == ‘ ‘)
                strTemp += "+";
            else
            {
                strTemp += ‘%‘;
                strTemp += ToHex((unsigned char)str[i] >> 4);
                strTemp += ToHex((unsigned char)str[i] % 16);
            }
        }
        return strTemp;
    }  

    std::string UrlDecode(const std::string& str)
    {
        std::string strTemp = "";
        size_t length = str.length();
        for (size_t i = 0; i < length; i++)
        {
            if (str[i] == ‘+‘) strTemp += ‘ ‘;
            else if (str[i] == ‘%‘)
            {
                assert(i + 2 < length);
                unsigned char high = FromHex((unsigned char)str[++i]);
                unsigned char low = FromHex((unsigned char)str[++i]);
                strTemp += high*16 + low;
            }
            else strTemp += str[i];
        }
        return strTemp;
    }  
时间: 2024-10-09 22:21:03

(C++)UrlEncode的标准实现的相关文章

PayPal网站付款标准版(for PHP)

简单整理一下PHP项目整合PayPal支付功能. 一.表单的构建: <form method="post" name="form" action="https://www.paypal.com/cgi-bin/webscr"> <input type="hidden" name="rm" value="2"/> <input type="hidde

使用NPOI导入导出标准Excel

尝试过很多Excel导入导出方法,都不太理想,无意中逛到oschina时,发现了NPOI,无需Office COM组件且不依赖Office,顿时惊为天人,怀着无比激动的心情写下此文. 曾使用过的方法 直接导出html,修改后缀名为.xls,这个方法有点像骗人的把戏,而且不能再导入 使用Jet OLEDB引擎来进行导入导出,完全使用sql语句来进行操作,缺点能控制的东西非常有限,比如格式就难以控制 使用Office COM组件进行导入导出,对环境依赖性太强(如"检索 COM 类工厂-"错

为什么要 urlencode()

1.是因为当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的 2. 因为 url 对字符有限制,比如把一个邮箱放入 url,就需要使用 urlencode 函数,因为 url 中不能包含 @ 字符. 3.url转义其实也只是为了符合url的规范而已.因为在标准的url规范中中文和很多的字符是不允许出现在url中的. 看一下php的urlencode的说明:urlencode - 编码 URL 字符串string urlencode ( string $str )

将table导出为Excel的标准无乱码写法

导出为Excel有很多种写法,对于一些复杂的格式,笔者喜欢在后台先拼成一个<table>,再使用Response输出. 如果数据中包含中文或者一些特殊字符,可很多不规范的写法都会导致页面乱码,这里就把一种(笔者认为)最标准的格式带给大家: Page p = HttpContext.Current.Handler as Page; p.Response.Clear(); p.Response.Buffer = true; p.Response.Charset = "UTF-8"

第十章 Python常用标准库使用(必会)

本章涉及标准库: 1.sys 2.os 3.glob 4.math 5.random 6.platform 7.pikle与cPikle 8.subprocess 9.Queue 10.StringIO 11.logging 12.ConfigParser 13.urllib与urllib2 14.json 15.time 16.datetime 10.1 sys 1)sys.argv 命令行参数. argv[0] #代表本身名字 argv[1] #第一个参数 argv[2] #第二个参数 ar

C++写的UrlEncode和UrlDecode

关于UrlEncode的实现(C++).网上有非常多不同的版本号.对须要编码的字符集的选取并不统一.那么究竟有没有标准呢?答案是有的.參见wiki 绝对不编码的,仅仅有字母.数字.短横线(-).下划线(_).点(.)和波浪号(~),其它字符要视情况而定.所以一般性的urlencode仅仅需保留上述字符不进行编码. 以下给出实现: [cpp] view plaincopy unsigned char ToHex(unsigned char x) { return  x > 9 ? x + 55 :

c#.net 使用NPOI导入导出标准Excel (asp.net winform csharp)

尝试过很多Excel导入导出方法,都不太理想,无意中逛到oschina时,发现了NPOI,无需Office COM组件且不依赖Office,顿时惊为天人,怀着无比激动的心情写下此文. 曾使用过的方法 直接导出html,修改后缀名为.xls,这个方法有点像骗人的把戏,而且不能再导入 使用Jet OLEDB引擎来进行导入导出,完全使用sql语句来进行操作,缺点能控制的东西非常有限,比如格式就难以控制 使用Office COM组件进行导入导出,对环境依赖性太强(如“检索 COM 类工厂…”错误):且需

支付宝钱包接口开发包2.0标准版接入与使用规则

接入与使用规则 支付宝钱包支付接口开发包 2.0 标准版 附录文档 版本号:1.3 支付宝(中国)网络技术有限公司 版权所有 支付宝钱包支付接口开发包 2.0 标准版附录文档 目录 1 文档说明..............................................................................................................4 1.1 文档说明...............................

Python标准库:HTTP客户端库urllib3

urllib3功能强大且易于使用,用于HTTP客户端的Python库.许多Python的原生系统已经开始使用urllib3. urllib3提供了很多python标准库urllib里所没有的重要特性: 线程安全 连接池 客户端SSL/TLS验证 文件分部编码上传 协助处理重复请求和HTTP重定位 支持gzip和deflate压缩编码 支持HTTP和SOCKS代理 100%测试覆盖率 Python3.x中将urllib2合并到了urllib,之后此包分成了以下几个模块: urllib.reques