Существует два набора функций для извлечения данных с экрана.Если ваш printw
использует только (как в вопросе) текст, который представлен в виде 8-битной кодировки (ASCII, POSIX, ISO-8859-1), то inch
и inchstr
работают:
inch
извлекает одну ячейку вместе с ее атрибутами inchstr
извлекает несколько ячеек вместе с их атрибутами
или более просто, используя instr
и его вариации.Эти функции возвращают данные без дополнительной необходимости маскировать атрибуты из символов.
Однако, если данные используют многобайтовую кодировку (например, UTF-8), то для извлечения символов необходимо использовать другой интерфейс.,Это эквиваленты inch
и inchstr
:
A сложный символ - это структура, которую X / Open Curses считает непрозрачной.Вы должны использовать getcchar
для извлечения данных (например, широкий символ строка) из данных каждой ячейки.
A (немного) проще, вы можетечитать из окна информацию о широких символах :
В итоге, в то время как ваше приложение может поместить данные в виде массива char
(или отдельных chtype
значения), в среде UTF-8 он должен извлекать его как сложные символы или широкие символы .Если вы используете Linux, вы обычно можете рассматривать wchar_t
как значения Юникода.Если данные представлены в виде массива wchar_t
значений, для получения многобайтовой (UTF-8) строки вы должны использовать другие функции (не являющиеся проклятиями).чем просто curses , уместно указать, что приложения, использующие ncurses, могут отличаться от X / Open Curses тем, как они выводят данные на экран (что может повлиять на ваши ожидания по поводу их получения).В ncurses addch
(и аналогичные char
-ориентированные функции) будут обрабатывать байты в многобайтовой строке, такой как UTF-8, сохраняя результат в виде широких символов.Ни одна из других реализаций X / Open Curses на сегодняшний день не делает этого.Другие рассматривают эти байты как независимые и могут представлять их как недопустимые широкие символы.
Кстати, с тех пор как вопрос был задан в 2010 году, ncurses 'scr_dump
формат былрасширен, делая его «читабельным».