template<typename IN_TYPE>// IN_TYPE : std::string 或 std::wstring
std::wstring decodeHtml(const IN_TYPE &s)
{
std::wstring sRet;
std::wstring tmp;
bool b1 = false;
bool b2 = false;
int nLen = s.size();
for (int i = 0; i < nLen; ++i)
{
wchar_t c = s[i];
if (!b1 && !b2 && c == '&')
{
b1 = true;
}
else if (!b2 && b1 && c == '#')
{
b2 = true;
}
else if (b1 && b2 && c >= '0' && c <= '9')
{
tmp += c;
}
else if (b1 && b2 && c == ';')
{
//decode
int iEncodeNum = _wtoi(tmp.c_str());
if ((iEncodeNum & 0xFFFF0000) == 0)
{
wchar_t wDecodeNum = static_cast<wchar_t>(iEncodeNum);
sRet += wDecodeNum;
}
else
{
sRet += L"&#" + tmp + L";";
}
b1 = false;
b2 = false;
tmp = L"";
}
else if (b1 && b2)
{
sRet += L"&#" + tmp + c;
b1 = false;
b2 = false;
tmp = L"";
}
else if (b1 && c != '#')
{
b1 = false;
sRet += L"&";
sRet += c;
}
else
{
sRet += c;
}
}
if (b1 && b2)
sRet += L"&#";
else if (b1)
sRet += L"&";
sRet += tmp;
return sRet;
}
std::wstring ws = decodeHtml<std::string>("123繁123");
std::wstring ws = decodeHtml<std::wstring>(L"123繁123");