转义C++字符串

Dan*_*nra 18 c++ string boost escaping

将C++ std :: string转换为另一个std :: string的最简单方法是什么,它将所有不可打印的字符转义?

例如,对于两个字符的字符串[0x61,0x01],结果字符串可能是"a\x01"或"a%01".

Jos*_*ley 11

看看Boost的字符串算法库.您可以使用其is_print分类器(连同其运算符!重载)来选择不可打印的字符,并且其find_format()函数可以替换具有您希望的任何格式的字符.

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

struct character_escaper
{
    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("a\x01");
    boost::find_format_all(s, boost::token_finder(!boost::is_print()), character_escaper());
    std::cout << s << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


小智 9

假设执行字符集是ASCII的超集,CHAR_BIT是8.对于OutIter,传递back_inserter(例如传递给vector <char>或另一个字符串),ostream_iterator或任何其他合适的输出迭代器.

template<class OutIter>
OutIter write_escaped(std::string const& s, OutIter out) {
  *out++ = '"';
  for (std::string::const_iterator i = s.begin(), end = s.end(); i != end; ++i) {
    unsigned char c = *i;
    if (' ' <= c and c <= '~' and c != '\\' and c != '"') {
      *out++ = c;
    }
    else {
      *out++ = '\\';
      switch(c) {
      case '"':  *out++ = '"';  break;
      case '\\': *out++ = '\\'; break;
      case '\t': *out++ = 't';  break;
      case '\r': *out++ = 'r';  break;
      case '\n': *out++ = 'n';  break;
      default:
        char const* const hexdig = "0123456789ABCDEF";
        *out++ = 'x';
        *out++ = hexdig[c >> 4];
        *out++ = hexdig[c & 0xF];
      }
    }
  }
  *out++ = '"';
  return out;
}
Run Code Online (Sandbox Code Playgroud)

  • 您也可以在标准C++中使用*和*而不使用标题.这是从另一个项目复制而来的,我忘了改变那些以弥补MSVC的不足. (4认同)

Sci*_*dix 5

假设“最简单的方法”意味着简短而又易于理解,同时又不依赖于任何其他资源(如lib),我将采用这种方式:

#include <cctype>
#include <sstream>

// s is our escaped output string
std::string s = "";
// loop through all characters
for(char c : your_string)
{
    // check if a given character is printable
    // the cast is necessary to avoid undefined behaviour
    if(isprint((unsigned char)c))
        s += c;
    else
    {
        std::stringstream stream;
        // if the character is not printable
        // we'll convert it to a hex string using a stringstream
        // note that since char is signed we have to cast it to unsigned first
        stream << std::hex << (unsigned int)(unsigned char)(c);
        std::string code = stream.str();
        s += std::string("\\x")+(code.size()<2?"0":"")+code;
        // alternatively for URL encodings:
        //s += std::string("%")+(code.size()<2?"0":"")+code;
    }
}
Run Code Online (Sandbox Code Playgroud)