c++ - 在 boost.spirit 中编码

标签 c++ encoding boost-spirit

我如何为 assign_a 中的值设置编码?我需要设置西里尔字母,但我不知道该怎么做

    #include "filter_data.h"
    #include <boost/bind.hpp>
    #include <boost/spirit.hpp>
    #include <boost/spirit/actor.hpp>
    #include <boost/spirit/attribute.hpp>
    #include <boost/config/warning_disable.hpp>
    #include <boost/spirit/home/support/char_encoding/standard_wide.hpp>
    #include <boost/spirit/home/support/char_class.hpp>
    #include <string>

    using namespace boost::spirit;
    using char_encoding::standard_wide;
    class filter_grammar : public grammar<filter_grammar>
    {
    public:

        static filter_data _filter_data;

    protected:

        static std::pair<std::wstring,std::wstring> _replace_arg;
        static std::wstring _remove_arg;
        static std::wstring _duplicate_arg;
        static std::wstring _errorstr;

        static void add_replace_arg();
        static void add_remove_arg();
        static void add_duplicate_arg();
        static void err();

    public:
        template<typename ScannerT>
        class definition {
        public:
            definition( const filter_grammar & self );

            rule<ScannerT> const & start() const ;

        private:
            rule<ScannerT> filters, filter_replace, filter_remove, filter_duplicate,errstr,arg;

            typedef definition _self;
        };
    };


    template<typename ScannerT>
    filter_grammar::definition<ScannerT>::definition( const filter_grammar & self )
    {
            filters = *(filter_replace|filter_remove|filter_duplicate|errstr);
            filter_replace = str_p("replace_word")>>blank_p>>arg[assign_a(_replace_arg.first)]>>blank_p>>arg[assign_a(_replace_arg.second)][boost::bind(&filter_grammar::add_replace_arg)]>>!(ch_p('\r'))>>ch_p('\n');
            filter_remove  = str_p("remove_word")>>blank_p>>arg[assign_a(_remove_arg)][boost::bind(&filter_grammar::add_remove_arg)]>>!(ch_p('\r'))>>ch_p('\n');
            filter_duplicate =  str_p("duplicate_word")>>blank_p>>arg[assign_a(_duplicate_arg)][boost::bind(&filter_grammar::add_duplicate_arg)]>>!(ch_p('\r'))>>ch_p('\n');
            errstr = *(arg[assign_a(_errorstr)][boost::bind(&filter_grammar::err)]>>!ch_p('_')>>!arg[assign_a(_errorstr)][boost::bind(&filter_grammar::err)]>>!blank_p)>>!(ch_p('\r'))>>ch_p('\n');

            arg = lexeme_d[+anychar_p];
    }

    template<typename ScannerT>
    rule<ScannerT> const & filter_grammar::definition<ScannerT>::start() const
    {
            return filters;
    }
filter_data filter_grammar::_filter_data;

std::pair<std::wstring,std::wstring> filter_grammar::_replace_arg;
std::wstring filter_grammar::_remove_arg;
std::wstring filter_grammar::_duplicate_arg;
std::wstring filter_grammar::_errorstr;

void filter_grammar::add_replace_arg ()
{
    try
    {
        _filter_data._replace.insert(std::make_pair(_filter_data._total_count,_replace_arg));
        _filter_data._queue.insert(std::make_pair(_filter_data._total_count,std::make_pair(1,_filter_data._total_count)));
        _filter_data._total_count++;
    }
    catch(std::exception& e)
    {
        std::wcerr << "Exception:" << e.what () << std::endl;
    }
}

void filter_grammar::add_remove_arg ()
{
    try
    {
        _filter_data._remove.insert(std::make_pair(_filter_data._total_count,_remove_arg));
        _filter_data._queue.insert(std::make_pair(_filter_data._total_count,std::make_pair(2,_filter_data._total_count)));
        _filter_data._total_count++;
    }
    catch(std::exception& e)
    {
        std::wcerr << "Exception:" << e.what () << std::endl;
    }
}

void filter_grammar::add_duplicate_arg ()
{
    try
    {
        _filter_data._duplicate.insert(std::make_pair(_filter_data._total_count,_duplicate_arg));
        _filter_data._queue.insert(std::make_pair(_filter_data._total_count,std::make_pair(3,_filter_data._total_count)));
        _filter_data._total_count++;
    }
    catch(std::exception& e)
    {
        std::wcerr << "Exception:" << e.what () << std::endl;
    }
}

void filter_grammar::err ()
{
    std::wcerr<<"Error - unknown symbol: "<<_errorstr<<" in filter file"<<std::endl;

}

最佳答案

首先,您将 Spirit.Classic(Spirit 的旧版本)与 Spirit.Qi(当前版本)混合。请不要这样做,因为它不会起作用,在最好的情况下它不会干扰,但很可能会破坏东西。

其次,Spirit.Classic 对编码的支持不是很好。我建议您完全切换到较新的版本 (Spirit.Qi)。这为您提供了使用积极支持的代码库以及比旧版本快得多的代码库的额外好处。恕我直言,它也更容易使用,但是 YMMV。

第三,如果您决定切换到 Spirit.Qi,您可能希望利用预先存在的编码。这可以通过显式使用,例如,iso8859_1::char_ 或 standard_wide::char_ 而不是默认的 qi::char_(相当于 ascii::char_)来完成。 qi::string 具有类似的编码特定对应项。 Spirit.Qi 也有一些初步的 unicode 支持,但这没有很好的记录。如果您对此感兴趣,请查看方案解析器示例。另一种选择是为 Spirit 编写您自己的编码,但这需要更多解释,因此您最好在 Spirit 邮件列表上讨论这个问题。

关于c++ - 在 boost.spirit 中编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3676171/

相关文章:

c++ - std::chrono::steady_clock::now 如何报告错误?

encoding - 为什么Notepad++可以正确显示ANSI编码的非ASCII字符而Sublime Text 2却不能?

java - 在 PHP 中加密时间戳并在 Java 中解密

c++ - 振奋 spirit 2 : is there a way to know what is the parser progression percentage?

c++ - 如何在没有预标记的情况下解析异构列表?

c++ - 编写递归字符串函数

从 C++ 使用时,Python 多处理不起作用

c++ - 在初始化列表中使用后递增运算符

video - libx264 和 ffmpeg 如何编码和解码 H.264

c++ - 根据类(Class)输入 boost spirit 业力生成