所以我从here看看UrlEncode函数:
std::string UriEncode(const std::string & sSrc)
{
const char DEC2HEX[16 + 1] = "0123456789ABCDEF";
const unsigned char * pSrc = (const unsigned char *)sSrc.c_str();
const int SRC_LEN = sSrc.length();
unsigned char * const pStart = new unsigned char[SRC_LEN * 3];
unsigned char * pEnd = pStart;
const unsigned char * const SRC_END = pSrc + SRC_LEN;
for (; pSrc < SRC_END; ++pSrc)
{
if (SAFE[*pSrc])
*pEnd++ = *pSrc;
else
{
// escape this char
*pEnd++ = '%';
*pEnd++ = DEC2HEX[*pSrc >> 4];
*pEnd++ = DEC2HEX[*pSrc & 0x0F];
}
}
std::string sResult((char *)pStart, (char *)pEnd);
delete [] pStart;
return sResult;
}
它不能在我的Visual Studio 2008下编译。如何使其工作(不使用任何特殊的Windows函数),SAFE[ const unsigned char ]
无论如何都意味着什么?
的更新 的 在源代码下查看zip文件我找到了
const char SAFE[256] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* 0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* 1 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* 2 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* 3 */ 1,1,1,1, 1,1,1,1, 1,1,0,0, 0,0,0,0,
/* 4 */ 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
/* 5 */ 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0,
/* 6 */ 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
/* 7 */ 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0,
/* 8 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* 9 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* A */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* B */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* C */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* D */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* E */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
/* F */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
};
让我害怕......如何让它在C ++类中可用?
答案 0 :(得分:3)
SAFE
似乎只是一个数组,标记哪些字符在URI中有效。它甚至还有行和列注释,以便更容易查看哪个条目。
您会看到第一个有效字符是0x30,或0
。 0x41-0x5A是大写字母等。
这样,当一个字符在URI中有效时,SAFE[*pSrc]
只是非零(“真”),而在非URI时则为零(“假”)。
答案 1 :(得分:3)
我会说SAFE
包含安全和不安全字符的标记。
因此,如果SAFE[c]
求值为true
(即数组值不是0
),则该字符是安全的,不需要编码。
将数组与the character handling functions in cctype.h
进行比较我认为您可以通过调用isalnum()
来简单地替换数组。
答案 2 :(得分:2)
您是否尝试在源代码中搜索SAFE?它是在第72行定义的256宽阵列。基本上,0-9,a-z和A-Z范围内的所有ASCII字符都标记为 safe ,而另一个则不安全。
因此,for循环正在字符串中运行,如果当前字符不在范围列表中,那么它将被转换为十六进制值。