如何使用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::请至少指定样本输入和预期输出。这是毫无疑问的,现在请您回答“标准”!