我正在使用 Ncurses 编写文本编辑器。我想知道是否有办法确定屏幕上可以放置多少个不同的字符,每个字符都用 UTF-8 编码。例如,当我得到 10 的屏幕宽度和 1 行时,我可以放置 10 个宽度为 1 的字符,其值如下:
0123456789
但是当我想放一排笑脸时,我只能放其中 4 个,在 10 号屏幕上:
所以在这个例子中,笑脸在屏幕上的宽度为 2,5。我想知道有没有办法确定屏幕上字符的宽度?
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.
*/