关于Qt自带的Url解码接口QUrl::fromPercentEncoding无法识别空格字符,会将其转为+,还有%后无法组成url编码规则的也会转成乱码字符。
因此需要采用C++的Url编解码规则,自己封装接口。
char dec2hexChar(short n) {
if (0 <= n && n <= 9) {
return char(short('0') + n);
}
else if (10 <= n && n <= 15) {
return char(short('A') + n - 10);
}
else {
return char(0);
}
}
short 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 {
return -1;
}
}
Url编码接口
QString urlEncode(const QString &url)
{
QString result;
string _url = url.toStdString();
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 == '/' || c == '.'
) {
result += c;
}
else
{
int j = (short)c;
if (j < 0) {
j += 256;
}
int m, n;
m = j / 16;
n = j - m * 16;
result += '%';
result += dec2hexChar(m);
result += dec2hexChar(n);
}
}
return result;
}
Url解码接口
QString urlDecode(const QString &url)
{
QString result;
string _url = url.toStdString();
for (unsigned int i = 0; i < _url.size(); i++)
{
char c = _url[i];
if ((c != '%') || (i >= _url.size()- 2))
{
result += c;
}
else
{
char c1 = _url[i + 1];
char c0 = _url[i + 2];
if (-1 == hexChar2dec(c1) || -1 == hexChar2dec(c0))
{
result += c;
continue;
}
int num = 0;
num += hexChar2dec(c1) * 16 + hexChar2dec(c0);
result += char(num);
i += 2;
}
}
return result;
}