ncurses использует wcwidth для определения количества столбцов, которые использует "широкий символ" (обычно значение Unicode) в 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.
*/