C/C++ urlencode编解码

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 
#include 
 
 
//#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
        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
        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);
}

 

 

 

你可能感兴趣的:(Qt,5.5,C++)