最近在用c++,找了几个库没有找到与javascript的URI编码相对应的函数。自己写一个,只写了编码,测试可以在javascript里用decodeURIComponent正常解码。
/**
* uri编码字符串.
*
* \param in 必须是utf-8编码的!
* \return uri编码后的字符串。
*/
std::string encodeURIComponent(std::string in)
{
std::stringstream ssUri;
for (char c : in)
{
//0-9A-Za-z-_.!~*'()
if ((c >= 'a' && c <= 'z')
|| (c >= 'A' && c <= 'Z')
|| (c >= '0' && c <= '9')
|| c == '!'
|| (c >= '\'' && c <= '*')
|| c == '-'
|| c == '.'
|| c== '_'
|| c== '~')
{
ssUri << c;
}
else
{
ssUri << "%";
if ((c & 0xf0) == 0)
ssUri << 0;
ssUri << setiosflags(ios::uppercase) << hex << (c & 0xff);
}
}
return ssUri.str();
}
后来写的解码:
/**
* URI解码.
*
* \param in URI编码的字符串。
* \return 解码后的字符串,是utf-8编码的。
*/
std::string decodeURIComponent(std::string in)
{
int readFlag = 0;
int code = 0;
std::stringstream ssUri;
for (char c : in)
{
if ((readFlag == 0) && (c == '%'))
{
readFlag = 1;
continue;
}
else if (readFlag == 1)
{
if (isxdigit(c))
{
if (isdigit(c))
code = c - '0';
else if (c >= 'A' && c <= 'F')
code = (0x0a+(c - 'A'));
else
return std::string();
readFlag = 2;
continue;
}
else
{
return std::string();
}
}
else if (readFlag == 2)
{
if (isxdigit(c))
{
code <<= 4;
if (isdigit(c))
code |= (c - '0');
else if (c >= 'A' && c <= 'F')
code |= (0x0a+(c - 'A'));
else
return std::string();
ssUri << (char) (code & 0xff);
code = 0;
readFlag = 0;
continue;
}
else
{
return std::string();
}
}
else
{
ssUri << c;
}
}
return ssUri.str();
}