将矩形打印到终端

时间:2017-04-28 03:46:42

标签: c linux non-ascii-characters

我正在尝试为Linux编写一个看起来像MS-DOS EDIT的文本编辑器。

然而,我陷入困境,因为我无法弄清楚如何在编辑器屏幕和对话框周围绘制细长方形。我知道Linux dialog命令可以做类似的事情:

如何在屏幕周围绘制像这样的矩形(最好没有诅咒)?

4 个答案:

答案 0 :(得分:4)

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃These are box-drawing characters.      ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│They live in the U+2500-U+257F range of│
│Unicode characters.                    │
└───────────────────────────────────────┘

░▒▓▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜▓▒░
░▒▓▌ The shadows are block elements, ▐▓▒░
░▒▓▌ Unicode U+2580-U+259F.          ▐▓▒░
░▒▓▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟▓▒░

曾几何时,box-drawing charactersblock elementsCP-437中很常见。现代终端可能期望UTF-8。 (他们在网络浏览器中不能很好地工作......如果上述文字看起来很奇怪,请参阅here。)

还有ANSI escapes来设置终端上显示的文本的背景颜色,前景色和其他属性。但是,我无法在Stack Overflow上很好地演示它。

答案 1 :(得分:4)

ncurses库是做你想做的事情的好方法,虽然你说你想要替代品。您可以将Unicode框绘制字符用作宽字符。它们包括MS-DOS代码页437中的所有字符。

现代发行版应默认设置为支持UTF-8,因此这应该有效。 (我建议将源文件保存为带字节顺序标记的UTF-8。)

#define _XOPEN_SOURCE 700

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

int main(void)
{
  setlocale( LC_ALL, "" );
  fputws( L"╒╩╤╣\n", stdout );

  return EXIT_SUCCESS;
}

如果没有curses,您可以检查环境变量LINESCOLS以获取终端的尺寸。在Linux控制台上打印颜色等的控制字符位于console_codes(4) man页面(并且是VT102控制代码的变体,它是VT100的超集,VT100是ANSI标准终端的超集)。如果你想从gnome_terminal这样的程序调用它,也检查它的文档,但它可能会实现xterm的扩展,这是VT102的扩展,等等。一个非常有用的是表单Feed字符'\L'将清除屏幕并让您重绘它。您还可以使用terminfo或termcap作为更抽象和通用的界面,但实际上,除了VT100的扩展以及ANSI颜色之外,没有人使用任何其他内容。

确保终端字体包含您要使用的线条图字符! DejaVu Sans Mono是一种优秀的等宽字体,特别是对于Unicode的覆盖。此外,您可以使用locale命令检查您的语言环境是否设置正确;您看到的区域设置名称应以.utf8UTF-8

结尾

答案 2 :(得分:2)

您所描述的是使用各种扩展字符集中的box drawing characters。可用的字符至少取决于平台和终端仿真。

鉴于您的问题是用Linux标记的,最简单的方法是使用ncurses库。为什么你不想使用它并且必须重新发明那个轮子?

如果您可以期望至少VT100仿真(合理),那么您可以使用基本线条图,但更高级别有更多字符。

它有点旧,但请看一下窗口示例代码:

您可能还想查看Xterm转义字符(展开VT100集):

答案 3 :(得分:0)

您正在寻找box-drawing characters。这是一张完整的表格。

假设您的系统安装了Unicode字体,这是大多数现代发行版所做的,您可以将它们打印到您的终端,如下所示:

#include <wchar.h>
#include <locale.h>
...
    setlocale(LC_ALL,"en_US.UTF-8");
    wprintf(L"\u250C\u2500\u2510\n");    // ┏━┓
    wprintf(L"\u2502 \u2502\n");         // │   │
    wprintf(L"\u2514\u2500\u2518\n");    // └━─┘