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);
}