std :: string的转义表示形式

时间:2012-12-14 14:25:56

标签: c++

我正在执行以下代码,请阅读:

Escaping a C++ string

#include <iostream>
#include <boost/format.hpp>
#include <boost/algorithm/string.hpp>

struct CharacterEscaper
{
    template<typename FindResultT>
    std::string operator()(const FindResultT& Match) const
    {
        std::string s;
        for (typename FindResultT::const_iterator i = Match.begin();i != Match.end();i++) 
        {
            s += str(boost::format("\\x%02x") % static_cast<int>(*i));
        }
        return s;
    }
};

int main (int argc, char **argv)
{
    std::string s("start\x0aend");
    boost::find_format_all(s, boost::token_finder(!boost::is_print()), CharacterEscaper());
    std::cout << s << std::endl;
    return 0;
}

我得到的输出是:

start\xffffffaend

我期待以下内容:

start\x0aend

读过这个:

http://en.cppreference.com/w/cpp/language/escape

什么是正确的?

2 个答案:

答案 0 :(得分:1)

这里有两个问题:

  • 在格式化之前,escaper会将字符值转换为int。这意味着,如果char已签名,则0x7f以上的值将进行符号扩展,从而在输出中提供额外的f s。您可以先修改为unsigned char,然后转换为unsignedint来解决此问题。 (我不太了解Boost格式化程序知道第二次转换是否必要。)
  • 十六进制转义序列将包含尽可能多的十六进制数字,因此在这种情况下它将是\x0ae。解决这个问题的一种方法是将字符串文字分解为两个,这将在编译期间重新组合:"start\x0a" "end"

答案 1 :(得分:0)

我想我有答案。我应该写这个:"start\x0a" "end"