url编码
以下是url中可能用到的特殊字符及在url中的经过编码后的值:
特殊字符的含义
URL编码
# 用来标志特定的文档位置 %23
% 对特殊字符进行编码 %25
& 分隔不同的变量值对 %26
+ 在变量值中表示空格 %2B
/ 表示目录路径 %2F
\ 表示目录路径 %5C
= 用来连接键和值 %3D
? 表示查询字符串的开始 %3F
空格 空格 %20
. 句号 %2E
: 冒号 %3A
但上面并不是一个特殊的映射集,%编码是有特点的规则的:
url编码,只是将串的内存数据按字节用16进制表示,
由上可知,数字,字母,’.’ 是不进行url编码的。
下为源码,接好(如有不当,联系我)
#include<string>
#include<iostream>
using namespace std;
char dec2hexChar(short int n) {
if (0 <= n && n <= 9) {
return char(short(\'0\') + n);
}
else if (10 <= n && n <= 15) {
return char(short(\'A\') + n - 10);
}
else
throw "except occurred";
}
short int hexChar2dec(char c) {
if (\'0\' <= c && c <= \'9\') {
return short(c - \'0\');
}
else if (\'a\' <= c && c <= \'f\') {
return (short(c - \'a\') + 10);
}
else if (\'A\' <= c && c <= \'F\') {
return (short(c - \'A\') + 10);
}
else
throw "except";
}
string escapeURL(const string &URL)
{
string result = "";
for (unsigned int i = 0; i<URL.size(); i++) {
char c = URL[i];
if (
(\'0\' <= c && c <= \'9\') ||
(\'a\' <= c && c <= \'z\') ||
(\'A\' <= c && c <= \'Z\') ||
c == \'.\') {
result += c;
}
else {
int j = (short int)c;
if (j < 0) {
j += 256;
}
int i1, i0;
i1 = j / 16;
i0 = j - i1 * 16;
result += \'%\';
result += dec2hexChar(i1);
result += dec2hexChar(i0);
}
}
return result;
}
string deescapeURL(const string &URL) {
string result = "";
for (unsigned int i = 0; i<URL.size(); i++) {
char c = URL[i];
if (c != \'%\') {
result += c;
}
else {
char c1 = URL[++i];
char c0 = URL[++i];
int num = 0;
num += hexChar2dec(c1) * 16 + hexChar2dec(c0);
result += char(num);
}
}
return result;
}
int main()
{
string str = "岁月123abc.#";
string temp = escapeURL(str);
std::cout<<temp << endl;
std::cout << deescapeURL(temp) << endl;
getchar();
return 0;
}