1

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

0123456789

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

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

4

1 回答 1

3

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

虽然wcwidth是标准功能,但它不完全标准化(我可以离题)。大多数实现使用定期更新的表(问题的一个来源),终端仿真器可能/可能不一致,字体可能与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.
 */
于 2019-04-08T08:36:18.197 回答