htmlcxx是一款很不错的解析html和css的开源库, 但是在解析存在中文的网页时却出现断言_ASSERTE((unsigned)(c + 1) <= 256), 比较烦人, 该问题是由于isspace函数判断非ascii字符是会出现该断言, isspace要求传入的参数必须是小于256的ascii, 而中文的ascii值是大于256的, 针对这一问题, 有两种解决方案.
方案1. 设置编译选项.
右键htmlcxx工程-->属性-->配置属性-->c/c++-->语言-->默认char为无符号选择(是/J).
重新编译该库, 使用时就不会报断言.
方案2. 修改源代码.
打开Node.cc文件,定位到第72,74,81行代码,修改如下:
//72行、
//while (isspace(*begin) && begin < end) ++begin;
while ((!((unsigned)*begin > 255) && isspace(*begin)) && begin < end) ++begin;
//74行、
//while (isspace(*trimmed_end) && trimmed_end >= begin) --trimmed_end;
while ((!((unsigned)*trimmed_end > 255) && isspace(*trimmed_end)) && trimmed_end >= begin) --trimmed_end;
//81行.
//while (*end && ! isspace(*end) && *end != '>') end++;
while (*end &&((unsigned)*end > 255 || !isspace(*end) ) && *end != '>') end++;
然后, 找到第28行,修改如下:
while (!isspace(*ptr))
{
if(*ptr == '>')
return;
++ptr;
}
再然后定位到PaserSax.tcc文件, 找到SkiphtmlComment函数, 修改如下:
template <typename _Iterator>
_Iterator
htmlcxx::HTML::ParserSax::skipHtmlComment(_Iterator c, _Iterator end)
{
while ( c != end ) {
if (*c++ == '-' && c != end && *c == '-')
{
_Iterator d(c);
while (++c != end &&((unsigned)*c > 255 || !isspace(*c) ) && *c != '>');
if (c == end || *c++ == '>') break;
c = d;
}
}
return c;
}
搞定收工.