Как определить ширину символа?
Задача: определить ширину текста (в колонках) перед его выводом на линуксовый терминал.
Планирую определить ширину строки как сумму ширин входящих в строку символов.
Каждый символ может занимать 0, 1 или 2 знакоместа:
- 0 - непечатаемые кодепоинты, а также кодепоинты, добавляющие какую-нибудь закорючку к предыдущему символу
- 1 - обычные символы, напр, латинские или русские буквы
- 2 - напр, китайские иероглифы, занимающие два знакоместа
Решение должно быть изолированным (т.е., не должно зависеть от текущих настроек эмулятора терминала, в котором работает скрипт). Если случится такое, что в разных моноширинных шрифтах какой-то символ имеет то обычную, то двойную ширину, то можно выбрать любую ширину для этого символа: и 1, и 2.
Как отличить символы обычной ширины от двойной ширины, я нашёл: нужно посмотреть свойство EastAsianWidth в Unicode Character Database
А как понять, что символ нулевой ширины (т.е., не увеличивает ширину строки)?
Будет ли достаточно смотреть только на название категории символа без учёта доп. свойств символа?
Список всех категорий
C = "Other",
Cc = "Control",
Cf = "Format",
Cn = "Unassigned",
Co = "Private_Use",
Cs = "Surrogate",
L = "Letter",
LC = "Cased_Letter",
Ll = "Lowercase_Letter",
Lm = "Modifier_Letter",
Lo = "Other_Letter",
Lt = "Titlecase_Letter",
Lu = "Uppercase_Letter",
M = "Mark",
Mc = "Spacing_Mark",
Me = "Enclosing_Mark",
Mn = "Nonspacing_Mark",
N = "Number",
Nd = "Decimal_Number",
Nl = "Letter_Number",
No = "Other_Number",
P = "Punctuation",
Pc = "Connector_Punctuation",
Pd = "Dash_Punctuation",
Pe = "Close_Punctuation",
Pf = "Final_Punctuation",
Pi = "Initial_Punctuation",
Po = "Other_Punctuation",
Ps = "Open_Punctuation",
S = "Symbol",
Sc = "Currency_Symbol",
Sk = "Modifier_Symbol",
Sm = "Math_Symbol",
So = "Other_Symbol",
Z = "Separator",
Zl = "Line_Separator",
Zp = "Paragraph_Separator",
Zs = "Space_Separator",