C/C++ urlencode编解码

本文深入探讨了URL编码及解码的过程,包括其在URI中的应用、转换规则以及工具类实现,帮助开发者掌握关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

urlencode编码的工具类

        urlencode是一个函数,可将字符串以URL编码,用于编码处理。

 

本函数将字符串以 URL 编码。例如空格就会变成加号。Homepage 中 form 资料传送就是用 urlencode 编码后再送出。

百分号编码(Percent-encoding), 也称作URL编码(URL encoding), 是特定上下文的统一资源定位符 (URI)的编码机制. 实际上也适用于统一资源标志符(URI)的编码. 也用于为"application/x-www-form-urlencoded" MIME准备数据, 因为它用于通过HTTP的请求操作(request)提交HTML表单数据。

URI所允许的字符分作保留与未保留. 保留字符是那些具有特殊含义的字符. 例如, 斜线字符用于URL (或者更一般的, URI)不同部分的分界符. 未保留字符没有这些特殊含义. 百分号编码把保留字符表示为特殊字符序列. 上述情形随URI与URI的不同版本规格会有轻微的变化。

部分转换规则如下:

空格!#$%+@:=%3F
%20%21%23%24%25%2B%40%3A%3D?

以上说明摘自百度百科http://baike.baidu.com/link?url=9Xw9OGukSDJuXa8fOxBNiSPGV1ooOyYtgrlUGZRk-cDSkFpcwyyV77UurMROSt9t9CkwUHltF55llw-S2ukWwq

总结起来就是

 

1. 字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。

2. 特殊字符 "."、"-"、"*" 和 "_" 保持不变。

3. 空格字符 " " 转换为一个加号 "+"。

4. 所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。编码机制是 UTF-8。

“中文CPU123”转化为“%E4%B8%AD%E6%96%87CPU123”。

注意:如果是GB2312的编码方式, 中文CPU123 的转化结果将是 %d6%d0%ce%c4CPU123

urldecode采用相反规则。

urlencode的工具类主要有以下2个文件

1、urlencode.h

 

#include <string>
#include <ctype.h>

 

 
//#define ASC2_0 48
//#define ASC2_A 65
//#define ASC2_Z 90
//#define ASC2_a 97
//#define ASC2_z 122

 

 
using namespace std;

 

 
unsigned char toHex(unsigned char c);
unsigned char fromHex(unsigned char h);
void encodeUrl(const string& str, string& result);
void encodeUrl(const char* str, string& result);
void decodeUrl(const string& str, string& result);
void decodeUrl(const char* str, string& result);

 

2、urlencode.cpp

 

#include "urlencode.h"

 
unsigned char toHex(unsigned char c) {
    return c > 9? 'A'-10+c : '0'+c;
}

 
unsigned char fromHex(unsigned char h) {
    unsigned char c = 0;
    if(h>='A' && h<='Z') {
        c = h-'A'+10;
    }else if(h>='a' && h<='z') {
        c = h-'a'+10;
    } else if(h>='0' && h<='9') {
        c = h-'0';
    } else {
    }
    return c;
}

 
void encodeUrl(const string& str, string& result) {
    int len = str.length();
    for(int i=0; i<len; i++) {
        if(isalnum((unsigned char)str[i]) ||
                (str[i]=='.')||(str[i]=='-')||(str[i]=='*')||(str[i]=='_')) {
            result += str[i];
        } else if(str[i] == ' ') {
            result += '+';
        } else {
            result += '%';
            result += toHex((unsigned char)str[i] >> 4);
            result += toHex((unsigned char)str[i] & 0xF);
        }
    }
}

 
void encodeUrl(const char* str, string &result) {
    string tmp = str;
    encodeUrl(tmp, result);
}

 
void decodeUrl(const string& str, string &result) {
    result = "";
    int len = str.length();
    for(int i=0; i<len; i++) {
        if((str[i]=='.')||(str[i]=='-')||(str[i]=='*')||(str[i]=='_')) {
            result += str[i];
        } else if(str[i] == '+') {
            result += ' ';
        } else if(str[i] == '%') {
            assert(i+2 < len);
            unsigned char high = fromHex((unsigned char)str[++i]);
            unsigned char low = fromHex((unsigned char)str[++i]);
            result += ((high<<4) | low);
        } else if(isalnum((unsigned char)str[i])){
            result += str[i];
        } else {
        }
    }
}

 
void decodeUrl(const char* str, string &result) {
    string tmp = str;
    decodeUrl(tmp, result);
}

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值