我正在尝试为Linux编写一个看起来像MS-DOS EDIT
的文本编辑器。
然而,我陷入困境,因为我无法弄清楚如何在编辑器屏幕和对话框周围绘制细长方形。我知道Linux dialog
命令可以做类似的事情:
如何在屏幕周围绘制像这样的矩形(最好没有诅咒)?
答案 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 characters和block elements在CP-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,您可以检查环境变量LINES
和COLS
以获取终端的尺寸。在Linux控制台上打印颜色等的控制字符位于console_codes(4)
man
页面(并且是VT102控制代码的变体,它是VT100的超集,VT100是ANSI标准终端的超集)。如果你想从gnome_terminal
这样的程序调用它,也检查它的文档,但它可能会实现xterm的扩展,这是VT102的扩展,等等。一个非常有用的是表单Feed字符'\L'
将清除屏幕并让您重绘它。您还可以使用terminfo或termcap作为更抽象和通用的界面,但实际上,除了VT100的扩展以及ANSI颜色之外,没有人使用任何其他内容。
确保终端字体包含您要使用的线条图字符! DejaVu Sans Mono是一种优秀的等宽字体,特别是对于Unicode的覆盖。此外,您可以使用locale
命令检查您的语言环境是否设置正确;您看到的区域设置名称应以.utf8
或UTF-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"); // └━─┘