UrlEscape
此函数将字符串编码使其可用于URL请求。
此函数将除了 "-_." 之外的所有非字母数字字符替换成百分号(%)后跟两位十六进制数,空格则编码为"%20"。此编码与RFC1738 编码相同,与 WWW 表单 POST 数据的编码方式在空格的处理上不同,同时与 application/x-www-form-urlencoded 的媒体类型编码方式在空格的处理上不同。(后二者把空格编码为"+")
HRESULT UrlEscape(/* IN */ LPCSTR strUrl, /* OUT */ LPSTR &strEscaped) {
if(strEscaped != NULL) {
return E_FAIL;
}
int nLength = strlen(strUrl) * 3 + 1;
strEscaped = new CHAR[nLength];
memset(strEscaped, 0, nLength);
for(CONST CHAR* p=strUrl; *p != 0; ++ p) {
if(*p == '+') {
strcat(strEscaped, "%2B");
} else if(*p == ' ') {
strcat(strEscaped, "%20");
} else if(*p == '%') {
strcat(strEscaped, "%25");
} else if(*p == '=') {
strcat(strEscaped, "%3D");
} else if(*p == '&') {
strcat(strEscaped, "%26");
} else if(*p<33 || *p>127) {
CHAR chTemp = 0;
CHAR szTemp[3];strcat(strEscaped, "%");
chTemp = (CHAR)(((*p>>4)&0x0F) + '0');
if(chTemp > '9') {
chTemp += 7u;
}
sprintf(szTemp, "%c", chTemp);
strcat(strEscaped, szTemp);chTemp = (CHAR)((*p &0x0F) + '0');
if(chTemp > '9') {
chTemp += 7u;
}
sprintf(szTemp, "%c", chTemp);
strcat(strEscaped, szTemp);
} else {
CHAR szTemp[2];
sprintf(szTemp, "%c", *p);
strcat(strEscaped, szTemp);
}
}
return S_OK;
}