为什么boost::spirit::unicode::char_不再使用UTF-8 char*字符串

Why does boost::spirit::unicode::char_ no longer work with UTF-8 char* strings?

本文关键字:char UTF-8 字符串 boost spirit unicode 为什么 不再      更新时间:2024-09-30

使用boost版本1.60,我可以使用#define BOOST_SPIRIT_UNICODEboost::spirit::unicode::char_来处理UTF-8输入字符串,而无需任何进一步的预处理。对于升级版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;
}

使用Boost 1.65.1在我的本地盒子上运行,成功地进行了AND解析,而没有明显的ASAN/UBSAN跳闸。

我将Git repo foor Spirit中的提交一分为二,并在1.72.0(Spirit_VERSION 0x2058(的标记处发现了第一个损坏。

我发现了破坏它的承诺是

commit 16159fb335c9bb2040cf061e30fdd4deea9087e1 (HEAD)
Author: djowel <djowel@gmail.com>
Date:   Mon Aug 26 10:15:05 2019 +0800
add invalid ascii tests + fix

这似乎(无意中(倒退了这一点,因为它实际上不是ASCII。我会在Boost Spirit Repo上提交一个带有此分析的错误。

如果使用它有任何用处,只需使用Boost 1.76.0,但恢复16159fb335c9即可。