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转换的可能性?)。
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
相关文章:
- MSVC UTF8字符串编码使用了不正确的代码点
- 在 C++ 中将 utf8 wstring 转换为窗口中的字符串
- C++ 检查 UTF8 字符串包含指定的字符
- 将STD :: U8String复制到一个UTF8字符的C风格字符串中
- 使用REGEX以UTF8格式过滤字符串
- 如何使用std :: codecvt_utf8_utf16在没有任何字符串类的情况下转换为UTF8
- 转换一个带有UTF8 WSTRING控制台的装饰的字符串
- 如何转换为C 中的UTF8字符串
- C#回调接收UTF8字符串
- C++将ASII转义的unicode字符串转换为utf8字符串
- 作为utf8字符串的utf16字符串的长度
- UTF8 字符串到整数
- 从服务器响应中解析 UTF8 字符串
- 是一个C++字符串类,我可以用来处理 UTF8 字符串
- 火鸟在“UTF8 字符串转换为 wstring”时崩溃
- 在android NDK jni中加密和解密utf8字符串
- Boost Spirit(X3)符号表产生UTF8字符串
- 在窗口中用UTF8字符串打开文件名
- 用c++将UTF8字符串转换为UTF16字符串
- c++字符串擦除不适用于UTF8字符串,我可以使用什么库