Boost Spirit (X3) 符号表生成 UTF8 字符串
Boost Spirit (X3) symbol tables resulting in UTF8 strings
我正在尝试将 LaTeX 转义码(例如 \alpha
)解析为 Unicode(数学)字符(即 U+1D6FC
)。
现在这意味着我正在使用这个 symbols
解析器(规则):
struct greek_lower_case_letters_ : x3::symbols<char32_t>
{
greek_lower_case_letters_::greek_lower_case_letters_()
{
add("alpha", U'\u03B1');
}
} greek_lower_case_letter;
这很好用,但结果是我得到了 std::u32string
。
我想要一种优雅的方式来将 Unicode 代码点保留在代码中(可能用于将来的自动化)和维护原因。有没有办法让这种解析器解析成 UTF-8 std::string
?
我想过将 symbols
结构解析为 std::string
,但那样效率非常低(我知道,过早优化 bla bla)。
我希望有一些优雅的方法而不是通过一堆箍来让它工作(symbols
将字符串附加到结果)。
我确实担心使用代码点值和想要 UTF8 会产生转换的运行时成本(或者是否存在 constexpr
UTF32->UTF8 转换可能性?)。
JSON parser example at cierelabs 展示了一种使用语义操作在 utf8 编码中附加代码点的方法:
auto push_utf8 = [](auto& ctx)
{
typedef std::back_insert_iterator<std::string> insert_iter;
insert_iter out_iter(_val(ctx));
boost::utf8_output_iterator<insert_iter> utf8_iter(out_iter);
*utf8_iter++ = _attr(ctx);
};
// ...
auto const escape =
('u' > hex4) [push_utf8]
| char_("\"\/bfnrt") [push_esc]
;
这用于他们
typedef x3::rule<unicode_string_class, std::string> unicode_string_type;
如您所见,将 utf8 序列构建到 std::string
属性中。
查看完整代码:https://github.com/cierelabs/json_spirit/blob/x3_devel/ciere/json/parser/x3_grammar_def.hpp
我正在尝试将 LaTeX 转义码(例如 \alpha
)解析为 Unicode(数学)字符(即 U+1D6FC
)。
现在这意味着我正在使用这个 symbols
解析器(规则):
struct greek_lower_case_letters_ : x3::symbols<char32_t>
{
greek_lower_case_letters_::greek_lower_case_letters_()
{
add("alpha", U'\u03B1');
}
} greek_lower_case_letter;
这很好用,但结果是我得到了 std::u32string
。
我想要一种优雅的方式来将 Unicode 代码点保留在代码中(可能用于将来的自动化)和维护原因。有没有办法让这种解析器解析成 UTF-8 std::string
?
我想过将 symbols
结构解析为 std::string
,但那样效率非常低(我知道,过早优化 bla bla)。
我希望有一些优雅的方法而不是通过一堆箍来让它工作(symbols
将字符串附加到结果)。
我确实担心使用代码点值和想要 UTF8 会产生转换的运行时成本(或者是否存在 constexpr
UTF32->UTF8 转换可能性?)。
JSON parser example at cierelabs 展示了一种使用语义操作在 utf8 编码中附加代码点的方法:
auto push_utf8 = [](auto& ctx)
{
typedef std::back_insert_iterator<std::string> insert_iter;
insert_iter out_iter(_val(ctx));
boost::utf8_output_iterator<insert_iter> utf8_iter(out_iter);
*utf8_iter++ = _attr(ctx);
};
// ...
auto const escape =
('u' > hex4) [push_utf8]
| char_("\"\/bfnrt") [push_esc]
;
这用于他们
typedef x3::rule<unicode_string_class, std::string> unicode_string_type;
如您所见,将 utf8 序列构建到 std::string
属性中。
查看完整代码:https://github.com/cierelabs/json_spirit/blob/x3_devel/ciere/json/parser/x3_grammar_def.hpp