如何以可读格式打印控制字符



我有一个程序,它倾向于不时输出控制字符,我希望它们以插入符号打印并用蓝色着色(如vim)。现在,我使用一个函数,在打印之前,在字符串上为我能想到的每个控制字符(^A^Z,加上^@和其他一些字符)调用boost::algorithm::replace_all()

有没有更好的方法可以做到这一点?我当前的解决方案似乎很通通,容易出错。

这里有一个解决方案(可能不是最优雅的):

std::string escape_control_characters(const std::string & s)
{
    std::string ret;
    for(std::string::const_iterator iter = s.begin(); iter != s.end(); ++iter)
    {
        const char c = *iter;
        if(c < ' ')
        {
            ret.push_back('^');
            ret.push_back(c + '@');
        }
        else if(c == 'x7F')
            ret.append("^?");
        else
            ret.push_back(c);
    }
    return ret;
}

[演示]

这不能处理蓝色部分,但听起来你已经知道如何做到这一点?

顺便说一下,您可能希望将if(c < ' ')更改为类似 if(c < ' ' && c != 't' && c != 'n') ,因为尽管制表符和换行符在技术上是控制字符(分别为 ^I^J),但打印它们可能是可以的。

最新更新