如何使用Boost Spirit解析中文(unicode utf-16)?

如何使用Boost Spirit解析中文(unicode utf-16)?,boost,unicode,cjk,utf-16,boost-spirit,Boost,Unicode,Cjk,Utf 16,Boost Spirit,我的程序不认识中文。 如何用精神来认识汉语? 我使用wstring并将其转换为utf-16 这是我的头文件: #pragma once #define BOOST_SPIRIT_UNICODE #include <boost/spirit/include/qi.hpp> #include <string> #include <vector> #include <map> using namespace std; namespace

我的程序不认识中文。 如何用精神来认识汉语? 我使用
wstring
并将其转换为utf-16

这是我的头文件:

#pragma once

#define BOOST_SPIRIT_UNICODE 

#include <boost/spirit/include/qi.hpp>  
#include <string>
#include <vector>
#include <map>
using namespace std;



namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;


typedef pair<wstring,wstring> WordMeaningType;
typedef vector<WordMeaningType> WordMeaningsType;
typedef pair<wstring,WordMeaningsType> WordType;
typedef vector<WordType> WordListType;

struct WordPaser
    :qi::grammar<wstring::iterator,WordListType(),ascii::space_type > 
{
public:
    qi::rule<wstring::iterator, wstring(),ascii::space_type> mRuleWordPart;
    qi::rule<wstring::iterator, wstring(),ascii::space_type> mRuleWordMeaning;
    qi::rule<wstring::iterator, wstring(),ascii::space_type> mRuleWord;

    qi::rule<wstring::iterator, WordMeaningType(),ascii::space_type> mRulePM;
    qi::rule<wstring::iterator, WordMeaningsType(),ascii::space_type> mRulePMs;
    qi::rule<wstring::iterator, WordType(),ascii::space_type> mRuleCurWPM;

    qi::rule<wstring::iterator, WordListType(),ascii::space_type> mRuleEntrence;


    wstring mCurWord;
    wstring mCurWordPart;
    wstring mCurWordMeaning;
    WordMeaningType mCurPM;
    WordMeaningsType mCurPMs;
    WordType mCurWPM;

    WordPaser();


};
#pragma一次
#定义BOOST_SPIRIT_UNICODE
#包括
#包括
#包括
#包括
使用名称空间std;
名称空间qi=boost::spirit::qi;
名称空间ascii=boost::spirit::ascii;
typedef对字表示类型;
typedef向量词meansingtype;
typedef对WordType;
typedef向量字列表类型;
结构WordPaser
:qi::语法
{
公众:
qi::规则mRuleWordPart;
qi::规则的含义;
齐:规则词;
qi::规则mRulePM;
qi:规则规则规则;
qi::规则mRuleCurWPM;
qi:规则请求;
wstring-mCurWord;
wstring-mCurWordPart;
wstring-mcurword含义;
词义类型mCurPM;
单词含义类型mCurPMs;
字型mCurWPM;
WordPaser();
};
和我的CPP文件:

#include <boost/tuple/tuple.hpp>  
#include <boost/spirit/include/qi.hpp>  
#include <boost/spirit/include/phoenix.hpp>  
#include "WordPaser.h"

namespace fusion = boost::fusion;  
namespace phoenix = boost::phoenix; 

using qi::_val;  
using qi::_1;  
using qi::_2;  
using qi::lit;  
using qi::lexeme;  
using qi::space;  
using ascii::char_;  
using ascii::string;  
using qi::graph;
using qi::word;

WordPaser::WordPaser()
     : WordPaser::base_type(mRuleEntrence)  
{


    mRuleWord %= lexeme[(+((qi::alpha)[std::wcout<<L'|'<<_1])>>*(qi::alpha|char_('(')|char_(')')))]; 

    mRuleWordPart  %= lexeme[(+(qi::alpha)[std::wcout<<L'@'<<_1]>>*(qi::alpha|char_('/')|char_('.'))[std::wcout<<L'@'<<_1])];  
    mRuleWordMeaning %= lexeme[(+( qi::graph|char_(L'(')|char_(L')')[std::wcout<<L':'<<_1]))];  

    mRulePM = (mRuleWordPart>>mRuleWordMeaning)
        [
            phoenix::bind(&WordMeaningType::first, _val)=_1, 
            phoenix::bind(&WordMeaningType::second, _val)=_2

        ];

    mRulePMs = +(mRulePM
        [
             phoenix::push_back(  _val , _1)
        ]);

    mRuleCurWPM = (mRuleWord>>mRulePMs)
        [
            phoenix::bind(&WordType::first, _val)=_1, 
            phoenix::bind(&WordType::second, _val)=_2            
        ];

    mRuleEntrence = +mRuleCurWPM
        [
            phoenix::push_back(_val, _1)
        ];

}
#包括
#包括
#包括
#包括“WordPaser.h”
名称空间融合=boost::fusion;
名称空间phoenix=boost::phoenix;
使用qi:(u val);
使用气::_1;
使用气::_2;
使用qi::lit;
使用气:词素;
使用气:空间;
使用ascii::char;
使用ascii::字符串;
使用qi::图;
用气:词;
WordPaser::WordPaser()
:WordPaser::基本类型(mRuleEntrence)
{

mRuleWord%=lexeme[(+((qi::alpha)[std::wcout您应该使用来自另一个名称空间的解析器/跳过器,而不是来自ascii。我想,在您的情况下,它应该是标准的。

此代码可以解析中文

  #define BOOST_TEST_DYN_LINK 
  #define BOOST_SPIRIT_USE_PHOENIX_V3 
  #define BOOST_SPIRIT_UNICODE 
  #include <boost/config/warning_disable.hpp>
  #include <boost/spirit/include/qi.hpp>
  #include <boost/spirit/include/support_standard_wide.hpp>
  #include <boost/spirit/include/karma.hpp>
  #include <boost/spirit/include/qi_parse.hpp>
  #include <boost/phoenix.hpp>
  #include <boost/fusion/include/std_pair.hpp>
  #define BOOST_TEST_MODULE MyTest
  #include <boost/test/unit_test.hpp>
  using namespace std;

BOOST_AUTO_TEST_CASE( parse_chinese)
  {
          namespace qi        = boost::spirit::qi  ;
          namespace ascii     = boost::spirit::ascii ;
          namespace encoding  = boost::spirit::unicode;
          namespace px        = boost::phoenix ;
          using namespace qi::labels;
          std::wstring test=L"中国" ;
          std::wstring found ;
          qi::rule<wstring::iterator,wstring(),encoding::space_type> unicode_string;
          unicode_string = * qi::unicode::char_ [_val += _1 ]  ;   
          if( qi::phrase_parse(test.begin(),test.end(),
                      unicode_string,
                      encoding::space,
                      found)
            )   
          {   
              BOOST_CHECK(true);
              //std::cout << "OK:" << utf16to8(found) << std::endl  ;
          }
          else
          {
              BOOST_CHECK(false);
          }
  }
#定义BOOST\u TEST\u DYN\u链接
#定义增强\u精神\u使用\u凤凰\u V3
#定义BOOST_SPIRIT_UNICODE
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义BOOST_TEST_模块MyTest
#包括
使用名称空间std;
BOOST_AUTO_TEST_案例(解析中文)
{
名称空间qi=boost::spirit::qi;
名称空间ascii=boost::spirit::ascii;
名称空间编码=boost::spirit::unicode;
名称空间px=boost::phoenix;
使用名称空间qi::标签;
标准::wstring测试=L“中国" ;
发现std::wstring;
qi::规则unicode\u字符串;
unicode_string=*qi::unicode::char_[\u val+=\u 1];
if(qi::phrase_parse(test.begin(),test.end(),
unicode_字符串,
编码::空间,
发现)
)   
{   
增压检查(真);

//std::请至少指定样本输入和预期输出。这是毫无疑问的,现在请您回答“标准”!