如何获得显示的字符串宽度?

如果字符串中包含非固定宽度字符(例如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

上一篇: How to get displayed width of a string?

下一篇: Question about interfaces in C#