Fra*_*ank 9 c++ parsing boost boost-spirit
如何使用utf8 unicode字符boost::spirit?
例如,我想识别此字符串中的所有字符:
$ echo "?? ?????? ????????? ????" | ./a.out
? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ?
Run Code Online (Sandbox Code Playgroud)
当我尝试这个简单的boost::spirit程序时,它将无法正确匹配unicode字符:
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/foreach.hpp>
namespace qi = boost::spirit::qi;
int main() {
std::cin.unsetf(std::ios::skipws);
boost::spirit::istream_iterator begin(std::cin);
boost::spirit::istream_iterator end;
std::vector<char> letters;
bool result = qi::phrase_parse(
begin, end, // input
+qi::char_, // match every character
qi::space, // skip whitespace
letters); // result
BOOST_FOREACH(char letter, letters) {
std::cout << letter << " ";
}
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它的行为如下:
$ echo "?? ?????? ????????? ????" | ./a.out | less
<D0> <9D> <D0> <B0> <D0> <B1> <D0> <B5> <D1> <80> <D0> <B5> <D0> <B3> <D1> <83> <D0> <BF> <D1> <83> <D1> <81> <D1> <82> <D1> <8B> <D0> <BD> <D0> <BD> <D1> <8B> <D1> <85> <D0>
<B2> <D0> <BE> <D0> <BB> <D0> <BD>
Run Code Online (Sandbox Code Playgroud)
更新:
好的,我对此工作了一点,以下代码有点工作.它首先将输入转换成32位的Unicode字符的迭代(如建议的此处):
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/foreach.hpp>
#include <boost/regex/pending/unicode_iterator.hpp>
namespace qi = boost::spirit::qi;
int main() {
std::string str = "?? ?????? ????????? ????";
boost::u8_to_u32_iterator<std::string::const_iterator>
begin(str.begin()), end(str.end());
typedef boost::uint32_t uchar; // a unicode code point
std::vector<uchar> letters;
bool result = qi::phrase_parse(
begin, end, // input
+qi::standard_wide::char_, // match every character
qi::space, // skip whitespace
letters); // result
BOOST_FOREACH(uchar letter, letters) {
std::cout << letter << " ";
}
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
代码打印Unicode代码点:
$ ./a.out
1053 1072 1073 1077 1088 1077 1075 1091 1087 1091 1089 1090 1099 1085 1085 1099 1093 1074 1086 1083 1085
Run Code Online (Sandbox Code Playgroud)
根据官方的Unicode表格,这似乎是正确的.
现在,有人可以告诉我如何打印实际字符,给定这个Unicode代码点向量?
我没有太多的经验,但显然Spirit(SVN trunk版本)支持Unicode.
#define BOOST_SPIRIT_UNICODE // We'll use unicode (UTF8) all throughout
Run Code Online (Sandbox Code Playgroud)
请参阅例如方案演示中的sexpr解析器示例.
BOOST_ROOT/libs/spirit/example/scheme
Run Code Online (Sandbox Code Playgroud)
我相信这是基于Bryce Lelbach 1演示的演示,该演示特别展示:
有一篇关于S表达式和变体的在线文章.
1如果确实如此,这里是该演示文稿中的视频和此处找到的幻灯片(pdf)(odp)
| 归档时间: |
|
| 查看次数: |
3843 次 |
| 最近记录: |