【问题标题】:"Width" of character on screen屏幕上字符的“宽度”
【发布时间】:2019-08-29 03:51:16
【问题描述】:

我正在使用 Ncurses 编写文本编辑器。我想知道是否有办法确定屏幕上可以放置多少个不同的字符,每个字符都用 UTF-8 编码。例如,当我得到 10 的屏幕宽度和 1 行时,我可以放置 10 个宽度为 1 的字符,其值如下:

0123456789

但是当我想放一排笑脸时,我只能放其中 4 个,在 10 号屏幕上:

??????????????????

所以在这个例子中,笑脸在屏幕上的宽度是 2,5。我想知道有没有办法确定屏幕上字符的宽度?

【问题讨论】:

  • 这不是由你使用的字体决定的吗?只有当每个字符的宽度相同时,您才能事先知道一定数量的字符的宽度。

标签: c++ ncurses codepoint


【解决方案1】:

ncurses 使用 wcwidth 来确定 wchar_t 中的“宽字符”(通常是 Unicode 值)使用的列数。这可能与终端实际所做的不同,但如果您的区域设置(LC_CTYPE 等)与终端的功能和配置一致,则结果相当一致。

虽然wcwidth 是一个标准函数,但它还没有完全标准化(我可以跑题了)。大多数实现使用定期更新的表(问题的一个来源),终端仿真器可能/可能不一致,并且 fonts 可能与wcwidth 中的值不对应.

考虑到所有这些,您始终可以通过写入您不显示的窗口来询问 ncurses(或 X/Open Curses 的其他一些实现)在屏幕上将使用多少列。例如,Lynx 在LYStrExtent0 中这样做:

/*
 * Determine the number of cells the given string would take up on the screen,
 * limited (in the case of wide characters) by the maxCells parameter.
 *
 * If the returnCellNum parameter is TRUE, return the number of cells;
 * otherwise, return the length (limited by the len parameter) of the prefix of
 * the string that fits in maxCells cells.
 */

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 2016-10-23
    • 2017-06-06
    • 2018-05-30
    • 1970-01-01
    • 2012-11-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多