gpt4 book ai didi

c++ - 在 Boost Spirit 中解码字符 UTF8 转义

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:12:47 26 4
gpt4 key购买 nike

问题: Spirit-general list

大家好,

我不确定我的主题是否正确,但测试代码可能会显示我想要实现的目标。

我正在尝试解析如下内容:

  • “%40”到“@”
  • “%3C”到“<”

我在下面有一个最小的测试用例。我不明白为什么这是行不通的。这可能是我犯了一个错误,但我没有看到。

使用:编译器:gcc 4.6Boost:当前主干

我使用以下编译行:

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;
}

问候,

马蒂斯·默尔曼

最佳答案

qi::xdigit 并不像您想象的那样:它返回原始字符(即 '0',而不是 0x00 ).

您可以利用 qi::uint_parser对您有利,作为奖励使您的解析更简单:

typedef qi::uint_parser<uchar, 16, 2, 2> xuchar;
  • 无需依赖 phoenix(使其适用于旧版本的 Boost)
  • 一次获得两个字符(否则,您可能需要添加大量转换以防止整数符号扩展)

这是一个固定的示例:

#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

关于c++ - 在 Boost Spirit 中解码字符 UTF8 转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8080422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com