5

有什么方法可以取回输出到 ncurses 上的变量中的字符?

假设我这样做:

printw("test");

那么我希望能够:

somefunc(strbuffer);
printf("%s",strbuffer); // test

我需要一个函数将屏幕上的所有字符取回一个变量,scr_dump get 关闭但输出格式不可读..

4

2 回答 2

11

如果您使用curses 函数(例如addch、mvaddch、addstr)将内容放在屏幕上,您可以使用inchstr)和相关函数从屏幕读取字符(使用AND'ing 返回值提取它们A_CHARTEXT)。

但是,如果您使用 printf 或任何其他非诅咒方法将文本放在屏幕上(包括对另一个使用诅咒的程序的系统调用),您将无法读取屏幕内容。

Curses 在内部维护当前屏幕内容,而 inchstr 函数使用屏幕的内部表示来查找当前内容。

于 2010-06-21T23:29:44.990 回答
3

有两组用于从屏幕检索数据的函数。如果您printw仅使用(如问题中所示)表示为 8 位编码(ASCII、POSIX、ISO-8859-1)的文本,则inch可以inchstr使用:

  • inch检索单个单元格及其属性
  • inchstr检索多个单元格及其属性

或更简单地使用instr及其变体。这些函数返回数据而不需要额外屏蔽字符的属性。

但是,如果数据使用多字节编码(例如 UTF-8),那么您必须使用不同的接口来检索字符。这些是 和 的等价inchinchstr

复杂字符是一种结构,X/Open Curses 将其视为不透明的。您必须使用来从每个单元格的数据getcchar中提取数据(例如宽字符串)。

A(一点)更简单,您可以从窗口中读取宽字符串信息:

总之,虽然您的应用程序可以将数据作为数组char(或单个chtype值)放置,但在 UTF-8 环境中,它必须将其检索为复杂字符宽字符。如果你碰巧使用的是 Linux,你通常可以将wchar_t其视为 Unicode 值。给定数据作为值数组wchar_t,您将使用其他(非诅咒)函数来获取多字节(UTF-8)字符串。

由于问题说的是ncurses而不是简单的curses,因此需要指出使用 ncurses 的应用程序在将数据放在屏幕上的方式上可能与 X/Open Curses 不同(这会影响您对检索它的期望)。在 ncurses 中,addch(和类似char的面向函数)将处理多字节字符串(如 UTF-8)中的字节,并将结果存储为宽字符。迄今为止,其他 X/Open Curses 实现都没有这样做。其他人将这些字节视为独立的,并且可能将它们表示为无效的宽字符。

顺便说一句,自从 2010 年提出这个问题以来,ncurses 的scr_dump格式已经被扩展,使其“可读”。

于 2017-11-16T09:52:04.800 回答