c++stringboostescaping

Escaping a C++ string


What's the easiest way to convert a C++ std::string to another std::string, which has all the unprintable characters escaped?

For example, for the string of two characters [0x61,0x01], the result string might be "a\x01" or "a%01".


Solution

  • Take a look at the Boost's String Algorithm Library. You can use its is_print classifier (together with its operator! overload) to pick out nonprintable characters, and its find_format() functions can replace those with whatever formatting you wish.

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