- Kod: Zaznacz cały
const unsigned html_entity_size = 142;
static const wchar_t* html_entity_names[] =
{
L"AElig", L"Aacute", L"Acirc", L"Agrave", L"Aring", L"Atilde",
L"Auml", L"Ccedil", L"Dagger", L"ETH", L"Eacute", L"Ecirc", L"Egrave",
L"Euml", L"Iacute", L"Icirc", L"Igrave", L"Iuml", L"Ntilde", L"OElig",
L"Oacute", L"Ocirc", L"Ograve", L"Omega", L"Oslash", L"Otilde", L"Ouml",
L"Scaron", L"THORN", L"Uacute", L"Ucirc", L"Ugrave", L"Uuml", L"Yacute",
L"Yuml", L"Zcaron", L"aacute", L"acirc", L"acute", L"aelig", L"agrave",
L"amp", L"apos", L"aring", L"asymp", L"atilde", L"auml", L"bdquote",
L"brvbar", L"bull", L"ccedil", L"cedil", L"cent", L"circ", L"copy",
L"curren", L"dagger", L"deg", L"divide", L"eacute", L"ecirc", L"egrave",
L"eth", L"euml", L"euro", L"fnof", L"frac12", L"frac14", L"frac34",
L"frasl", L"ge", L"gt", L"hellip", L"hibar", L"iacute", L"icirc",
L"iexcl", L"igrave", L"infin", L"int", L"iquest", L"iuml", L"laquo",
L"ldquo", L"le", L"loz", L"lsaquo", L"lsquo", L"lt", L"mdash",
L"micro", L"middot", L"nbsp", L"ndash", L"ne", L"not", L"ntilde",
L"oacute", L"ocirc", L"oelig", L"ograve", L"ordf", L"ordm", L"oslash",
L"otilde", L"ouml", L"para", L"part", L"permil", L"pi", L"plusmn",
L"pound", L"prod", L"quot", L"radic", L"raquo", L"rdquo", L"reg",
L"rsaquo", L"rsquo", L"sbquo", L"scaron", L"sect", L"shy", L"sum",
L"sup1", L"sup2", L"sup3", L"szlig", L"thorn", L"tilde", L"times",
L"trade", L"uacute", L"ucirc", L"ugrave", L"uml", L"uuml", L"yacute",
L"yen", L"yuml", L"zcaron"
};
static const wchar_t html_entity_ucodes[] =
{
198, 193, 194, 192, 197, 195, 196, 199, 8225,
208, 201, 202, 200, 203, 205, 206, 204, 207, 209,
338, 211, 212, 210, 937, 216, 213, 214, 352, 222,
218, 219, 217, 220, 221, 376, 381, 225, 226, 180,
230, 224, 38, 39, 229, 8776, 227, 228, 8222, 166,
8226, 231, 184, 162, 710, 169, 164, 8224, 176, 247,
233, 234, 232, 240, 235, 8364, 402, 189, 188, 190,
8260, 8805, 62, 8230, 175, 237, 238, 161, 236, 8734,
8747, 191, 239, 171, 8220, 8804, 9674, 8249, 8216, 60,
8212, 181, 183, 160, 8211, 8800, 172, 241, 243, 244,
339, 242, 170, 186, 248, 245, 246, 182, 8706, 8240,
960, 177, 163, 8719, 34, 8730, 187, 8221, 174, 8250,
8217, 8218, 353, 167, 173, 8721, 185, 178, 179, 223,
254, 732, 215, 8482, 250, 251, 249, 168, 252, 253,
165, 255, 382
};
wchar_t get_wcode(std::wstring::const_iterator i1,std::wstring::const_iterator i2)
{
wchar_t tmp[50];
std::copy(i1,i2,tmp);
tmp[i2 - i1] = 0;
if(tmp[0] == '#')
{
int c;
return (swscanf(&tmp[1],L"%i",&c) == 1) ? (wchar_t)c : L'?';
}
struct comp
{
bool operator()(const wchar_t *p1,const wchar_t *p2)const
{
return wcscmp(p1,p2) < 0;
}
};
const wchar_t** p = std::lower_bound(html_entity_names,
html_entity_names + html_entity_size ,
tmp,
comp());
if(p != html_entity_names + html_entity_size && wcscmp(tmp,*p) == 0)
{
return html_entity_ucodes[p - html_entity_names];
}
return L'?';
}
wstring html_dec_chars(const std::wstring &str)
{
std::wstring::const_iterator i1 = str.begin();
std::wstring::const_iterator i2 = i1;
std::wstring::const_iterator i3 = str.end();
std::wstring out;
while(i1 != i3)
{
while(i2 != i3 && *i2 != L'&')++i2;
out.append(i1,i2);
i1 = i2;
if(i1 != i3)++i1;
i2 = i1;
while(i2 != i3 && *i2 != L';')++i2;
out.append(1,get_wcode(i1,i2));
if(i2 != i3)++i2;
i1 = i2;
}
return out;
}
Użycie:
- Kod: Zaznacz cały
wstring s = L"Âsasasaasa&6666";
wstring o = html_parse(s);
html_entities zawiera chyba wszystkie możliwe kody. No i całość jest bardziej przenośna, niezależna od kodowania IDE.
____
p.s. formatowanie php wymięka przy tej ilości kodu. Dziwne, bo strasznie dużo go nie ma