"Width" 屏幕上的字符

"Width" of character on screen

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

0123456789

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

因此在此示例中,笑脸在屏幕上的宽度为 2,5。我想知道有没有办法确定屏幕上字符的宽度?

ncurses 使用 wcwidth 来确定 wchar_t 中的 "wide character"(通常是 Unicode 值)使用的列数。这可能与终端实际执行的操作不同,但如果您的语言环境(LC_CTYPE 等)设置与终端的功能和配置一致,则结果相当一致。

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

中的值

考虑到所有这些,您可以随时询问 ncurses(或 X/Open Curses 的其他实现)通过写入 window 来询问它在屏幕上将使用多少列不显示。例如,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.
 */