Разбор HTML escape-последовательности с boost spirit
Я пытаюсь разобрать текст с помощью HTML escape-последовательностей и хочу связать этот esaceps с их эквивалентами utf8:
- 0xC2A0 utf8 representation
­ - 0xC2AD utf8 representation
И пусть грамар решит эту задачу
template <typename Iterator>
struct HTMLEscape_grammar : qi::grammar<Iterator, std::string()>
{
HTMLEscape_grammar() :
HTMLEscape_grammar::base_type(text)
{
htmlescapes.add(" ", 0xC2AD);
htmlescapes.add("­", 0xC2AD);
text = +((+(qi::char_ - htmlescapes)) | htmlescapes);
}
private:
qi::symbols<char, uint32_t> htmlescapes;
qi::rule<Iterator, std::string()> text;
};
Но когда мы разбираем
std::string l_test = "test­as test simple­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);
Мы не получаем строку utf-8, 0xC2 часть символов utf8 просто вырезается, и мы получаем просто строку ascii. Этот парсер является сборным блоком более мощной системы, поэтому требуется вывод utf8.
1 ответ:
Я не знаю, как вы предполагаете, что разоблачение uint32_t волшебным образом выведет кодовую точку UNICODE. Не говоря уже о том, что что-то волшебным образом выполнит кодировку UTF8 для этого.
А теперь позвольте мне прояснить ситуацию. Вы хотите, чтобы выбранные HTML ссылки на сущности были заменены на 슭 (слог хангыль SEULG). В UTF-8 это будет 0xEC 0x8A 0xAD.Просто сделайте кодирование самостоятельно (вы все равно составляете выходной поток кодовых единиц UTF8):
#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(" ", { '\xEC', '\x8A', '\xAD' }); htmlescapes.add("­", { '\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­as test simple­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
Comments