我尝试用html转义序列解析文本,并希望用utf8等价物来表达这些esace:
- 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(" ", 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字符串,简单剪切的utf8符号的0xC2部分,我们只得到了ascii字符串。这个解析器是更强大系统的构建块,因此需要utf8输出。
答案 0 :(得分:3)
我不知道你如何假设暴露uint32_t会神奇地输出一个UNICODE代码点。更不用说某些东西会神奇地执行UTF8编码。
现在让我直截了当。您希望选择由<(HANGUL SYLLABLE SEULG)替换的HTML 实体引用。在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(" ", { '\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