2015-05-27 3 views
2

я пытаюсь разобрать текст с HTML экранирующих последовательностями и хочу chnage это esaceps с их utf8 equvivalents:Анализировать HTML избежать последовательностей с повышающим духом

  - 0xC2A0 utf8 representation 
­ - 0xC2AD utf8 representation 

И есть gramar решить эту

template <typename Iterator> 
struct HTMLEscape_grammar : qi::grammar<Iterator, std::string()> 
{ 
    HTMLEscape_grammar() : 
     HTMLEscape_grammar::base_type(text) 
    { 
     htmlescapes.add("&nbsp;", 0xC2AD); 
     htmlescapes.add("&shy;", 0xC2AD); 

     text = +((+(qi::char_ - htmlescapes)) | htmlescapes); 
    } 

private: 
    qi::symbols<char, uint32_t> htmlescapes; 
    qi::rule<Iterator, std::string()> text; 
}; 

но когда мы разбираем

std::string l_test = "test&shy;as test simple&shy;test"; 
HTMLEscape_grammar<std::string::const_iterator> l_gramar; 

std::string l_ast; 
bool result = qi::parse(l_test.begin(), l_test.end(), l_gramar, l_ast); 

мы не получаем utf8 строку, 0xC2 часть utf8 символов просто вырезать, и мы идем t просто строка ascii. Этот анализатор является блоком сборки более мощной системы, поэтому требуется выход utf8.

ответ

3

Я не знаю, как вы предполагаете, что разоблачение uint32_t будет магически выводить код UNICODE. Не говоря уже о том, что что-то волшебным образом выполнит кодировку UTF8.

Теперь позвольте мне получить это прямо. Вы хотите выбрать HTML ссылки на объекты заменены на 슭 (HANGUL SYLLABLE SEULG). В UTF-8 будет 0xEC 0x8A 0xAD.

Вобще, кодирующие себя (вы пишете выходной поток единиц UTF8 кода в любом случае):

Live On Coliru

#include <boost/spirit/include/qi.hpp> 
#include <iostream> 
#include <iomanip> 

namespace qi = boost::spirit::qi; 

template <typename Iterator> 
struct HTMLEscape_grammar : qi::grammar<Iterator, std::string()> 
{ 
    HTMLEscape_grammar() : 
     HTMLEscape_grammar::base_type(text) 
    { 
     htmlescapes.add("&nbsp;", { '\xEC', '\x8A', '\xAD' }); 
     htmlescapes.add("&shy;", { '\xEC', '\x8A', '\xAD' }); 

     text = *(htmlescapes | qi::char_); 
    } 

private: 
    qi::symbols<char, std::vector<char> > htmlescapes; 
    qi::rule<Iterator, std::string()> text; 
}; 

int main() { 
    std::string const l_test = "test&shy;as test simple&shy;test"; 
    HTMLEscape_grammar<std::string::const_iterator> l_gramar; 

    std::string l_ast; 
    bool result = qi::parse(l_test.begin(), l_test.end(), l_gramar, l_ast); 

    if (result) { 
     std::cout << "Parse success\n"; 
     for (unsigned char ch : l_ast) 
      std::cout << std::setw(2) << std::setfill('0') << std::hex << std::showbase << static_cast<int>(ch) << " "; 
    } else 
    { 
     std::cout << "Parse failure\n"; 
    } 
} 

Печати

Parse success 
0x74 0x65 0x73 0x74 0xec 0x8a 0xad 0x61 0x73 0x20 0x74 0x65 0x73 0x74 0x20 0x73 0x69 0x6d 0x70 0x6c 0x65 0xec 0x8a 0xad 0x74 0x65 0x73 0x74 
+1

sehe вам ответы Лучше, как всегда – tantra35

+0

Не всегда, но спасибо. Я надеюсь, что это то, что вы намеревались делать, в любом случае – sehe

Смежные вопросы