htmlcxx解析中文时出现断言_ASSERTE((unsigned)(c + 1) <= 256)的解决方法

来源:互联网 发布:java定义错误枚举类 编辑:程序博客网 时间:2024/04/30 05:17

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;    }


搞定收工.


0 0
原创粉丝点击