2011-11-10 71 views
4

問題問:Spirit-general list解碼焦炭UTF8在加速逃逸精神

您好所有,

我不知道如果我的主題是正確的,但testcode可能會顯示 我想要什麼實現。

我試圖解析之類的東西:

  • '%40' 改爲 '@'
  • '%3C' 到 '<'

下面我有一個最小的測試用例。我不明白爲什麼 這不起作用。這可能是我犯了一個錯誤,但我沒有看到它。

使用: 編譯器:GCC 4.6 升壓:當前軀幹

我使用下面的編譯行:

g++ -o main -L/usr/src/boost-trunk/stage/lib -I/usr/src/boost-trunk -g -Werror -Wall -std=c++0x -DBOOST_SPIRIT_USE_PHOENIX_V3 main.cpp 


#include <iostream> 
#include <string> 

#define BOOST_SPIRIT_UNICODE 

#include <boost/cstdint.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/phoenix/phoenix.hpp> 

typedef boost::uint32_t uchar; // Unicode codepoint 

namespace qi = boost::spirit::qi; 

int main(int argc, char **argv) { 

    // Input 
    std::string input = "%3C"; 
    std::string::const_iterator begin = input.begin(); 
    std::string::const_iterator end = input.end(); 

    using qi::xdigit; 
    using qi::_1; 
    using qi::_2; 
    using qi::_val; 

    qi::rule<std::string::const_iterator, uchar()> pchar = 
     ('%' > xdigit > xdigit) [_val = (_1 << 4) + _2]; 

    std::string result; 
    bool r = qi::parse(begin, end, pchar, result); 
    if (r && begin == end) { 
     std::cout << "Output: " << result << std::endl; 
     std::cout << "Expected: < (LESS-THAN SIGN)" << std::endl; 
    } else { 
     std::cerr << "Error" << std::endl; 
     return 1; 
    } 

    return 0; 
} 

問候,

MatthijsMöhlmann

回答

2

qi::xdigit不會做你認爲它做的事:它返回原始字符(即, '0',而不是0x00)。

你可以利用qi::uint_parser,你的優勢,使您的解析之多,獎金更簡單:

typedef qi::uint_parser<uchar, 16, 2, 2> xuchar; 
  • 沒有必要依靠鳳凰(使其工作在舊版本的Boost)
  • GET一氣呵成兩個字符(否則,您可能需要添加豐富的鑄造,防止整數符號擴展)

這裏是一個固定的上採樣:

#include <iostream> 
#include <string> 

#define BOOST_SPIRIT_UNICODE 

#include <boost/cstdint.hpp> 
#include <boost/spirit/include/qi.hpp> 

typedef boost::uint32_t uchar; // Unicode codepoint 

namespace qi = boost::spirit::qi; 

typedef qi::uint_parser<uchar, 16, 2, 2> xuchar; 
const static xuchar xuchar_ = xuchar(); 


int main(int argc, char **argv) { 

    // Input 
    std::string input = "%3C"; 
    std::string::const_iterator begin = input.begin(); 
    std::string::const_iterator end = input.end(); 

    qi::rule<std::string::const_iterator, uchar()> pchar = '%' > xuchar_; 

    uchar result; 
    bool r = qi::parse(begin, end, pchar, result); 

    if (r && begin == end) { 
     std::cout << "Output: " << result << std::endl; 
     std::cout << "Expected: < (LESS-THAN SIGN)" << std::endl; 
    } else { 
     std::cerr << "Error" << std::endl; 
     return 1; 
    } 

    return 0; 
} 

輸出:

Output: 60 
Expected: < (LESS-THAN SIGN) 

'<' 確實是ASCII 60