【发布时间】:2021-08-07 18:23:01
【问题描述】:
使用 boost 1.60 版,我可以使用 #define BOOST_SPIRIT_UNICODE 和 boost::spirit::unicode::char_ 来处理 UTF-8 输入字符串,而无需任何进一步的预处理。对于 boost 1.72 版,此操作失败并出现异常。
解决方案似乎是使用boost::u8_to_u32_iterator 并让spirit 处理宽字符串。但是为什么它在早期版本中工作得如此完美?如果可能的话,我该如何重新激活旧的行为?
这里是一些示例代码:
#define BOOST_SPIRIT_UNICODE
#include <boost/spirit/include/qi.hpp>
int main()
{
typedef std::string::const_iterator iterator_type;
namespace qi = boost::spirit::qi;
namespace unicode = boost::spirit::unicode;
std::string input("\"Test ⏳\"");
qi::rule<iterator_type, std::string(), unicode::space_type> quoted_string = qi::lexeme['"' >> +(unicode::char_ - '"') >> '"'];
iterator_type iter = input.begin();
iterator_type end = input.end();
std::string output;
bool r = phrase_parse(iter, end, quoted_string, unicode::space, output);
if (r && iter == end)
std::cout << "successfully parsed " << input << " to " << output << std::endl;
else
std::cout << "failed to parse " << input << std::endl;
return 0;
}
【问题讨论】:
-
看起来可能是UB:wandbox.org/permlink/JQADFgCQbCBZuLh5 这是一个不祥的警告,我无法在本地重现
标签: c++ boost unicode boost-spirit-qi