我有一个程序会不时输出控制字符,我希望它们以插入符号打印并以蓝色(如vim
)着色。现在,我使用一个函数,在打印字符串之前调用boost::algorithm::replace_all()
我能想到的每个控制字符(^A
通过^Z
、加号和其他一些字符)。^@
有一个更好的方法吗?我目前的解决方案似乎变通了并且容易出错。
我有一个程序会不时输出控制字符,我希望它们以插入符号打印并以蓝色(如vim
)着色。现在,我使用一个函数,在打印字符串之前调用boost::algorithm::replace_all()
我能想到的每个控制字符(^A
通过^Z
、加号和其他一些字符)。^@
有一个更好的方法吗?我目前的解决方案似乎变通了并且容易出错。
这是一种解决方案(可能不是最优雅的):
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
,分别),但打印它们可能是可以的。