如何获得显示的字符串宽度?
如果字符串中包含非固定宽度字符(例如t
)或转义代码(如ANSI颜色(如1xb[31m
)),则这些字符将添加到std::string
的.length()
std::string
,但不要在打印时添加到显示的长度。
C ++中有没有什么方法可以在* nix中获取字符串的显示宽度?
例如:
displayed_width("atb") would be 4 if the displayed tab width is 2
displayed_width("1xb[33mGREEN") would be 5
通常,选项卡会要求终端程序将光标移动到8的倍数列,尽管许多终端程序允许您配置该列。 通过这种行为,选项卡实际添加的宽度取决于光标相对于制表位的位置。 因此,仅仅知道字符串内容不足以计算可打印的宽度,而没有关于以前的光标放置和制表位的一些假设或洞察。
不可打印的代码也因终端类型而异,但如果您只需要ANSI颜色,那么这很容易。 你可以沿着字符串移动字符; 当你看到一个ESCAPE跳到终点m
。 像(未经测试)的东西:
int displayed_width(const char* p)
{
int result = 0;
for ( ; *p; ++p)
{
if (p[0] == 'e' && p[1] == '[')
while (*p != 'm')
if (*p)
++p;
else
throw std::runtime_error("string terminates inside ANSI colour sequence");
else
++result;
}
return result;
}
没有内置任何内容。制表符的“显示宽度”是一个实现细节,控制台转义序列也是。 C ++并不关心特定于平台的事情。
有没有特别想要做的事情? 如果我们知道您正在从事哪些特定任务,我们可能会提出其他建议。
根据我的了解,不采用标准方法。 C ++不知道终端。 我的猜测是使用NCURSES。 不知道,如果提升有一些事情,但这一点。
链接地址: http://www.djcxy.com/p/8661.html