前言
在C++ MFC应用程序中可能需要将用户输入的字符转为URL编码。本函数可将CString转为URL编码。
代码(C++)
CString URLEncode(CString strToEncode, CString strNoEncode=_T(""))// strNoEncode 为不编码的字符
{
// 默认不转换的字符
if (strNoEncode.IsEmpty())
{
strNoEncode = _T("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:/.?_-=&");
}
CString strEncoded; // 转换结果
for (int i = 0; i < strToEncode.GetLength(); i++)
{
CString strCur = strToEncode.Mid(i, 1); // 当前要被转换的字符
// 判断是否需要转换
BOOL bNoEncode = FALSE;
for (int j = 0; j < strNoEncode.GetLength(); j++)
{
if (strCur == strNoEncode.Mid(j, 1))
{
bNoEncode = TRUE;
break;
}
}
// 不需要转换的字符直接拼接到要输出的字符串中
if (bNoEncode)
{
strEncoded += strCur;
continue;
}
// 需要转换的字符先转码
LPCWSTR unicode = T2CW(strCur);
int len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, 0, 0, 0, 0);
char* utf8 = new char[len];
WideCharToMultiByte(CP_UTF8, 0, unicode, len, utf8, len, 0, 0);
// 转码后的字符格式化拼接到输出的字符串中
for (int k = 0; k < len - 1; k++) // 不处理最后一个字符串终止符号
{
strEncoded.AppendFormat(_T("%%%02X"), utf8[k] & 0xFF);
}
}
return strEncoded;
}
范例
CString v = _T("你们的饺子MCjiaozi");
CString r = URLEncode(v);
//结果:r = _T("%e4%bd%a0%e4%bb%ac%e7%9a%84%e9%a5%ba%e5%ad%90MCjiaozi")