«Ширина» символа на экране - PullRequest
0 голосов
/ 08 апреля 2019

Я использую Ncurses для написания текстового редактора. Я хотел бы знать, есть ли способ определить, сколько разных символов может быть размещено на экране, где каждый из символов кодируется с помощью UTF-8. Например, когда я получаю ширину экрана 10 и одну строку, я могу поместить 10 символов шириной 1 со значениями, как показано ниже:

0123456789

Но когда я хотел бы разместить целый ряд улыбающихся лиц, я могу разместить только 4 из них на экране размером 10:

????

Так что в этом примере улыбающееся лицо занимает ширину 2,5 на экране. Я хотел бы знать, есть ли способ определить ширину символа на экране?

1 Ответ

1 голос
/ 08 апреля 2019

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.
 */
...