【问题标题】:Print rectangles to terminal将矩形打印到终端
【发布时间】:2017-09-26 01:36:17
【问题描述】:

我正在尝试为 Linux 编写一个类似于 MS-DOS EDIT 的文本编辑器。

但是,我被困住了,因为我不知道如何在编辑器屏幕和对话框周围绘制细长的矩形。我知道 Linux dialog 命令可以做类似的事情:

我怎样才能在屏幕周围画出这样的矩形(最好没有诅咒)?

【问题讨论】:

  • 如果你只想将二进制字符输出到屏幕上,你可以在 python 中运行它来查看每个字符的样子,这样你就可以选择角等。for i in range(127,256): print i,hex(i),chr(i)
  • 你为什么不想使用curses或衍生工具?它是制作来解决这样的问题的。

标签: c linux non-ascii-characters


【解决方案1】:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃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 上很好地展示它。

【讨论】:

    【解决方案2】:

    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 的超集,ANSI 标准终端的超集)。如果你想从gnome_terminal之类的程序中调用它,也请查看它的文档,但它可能会实现xterm的扩展,它是VT102的扩展等。一个非常有用的是换页符'\L' 将清除屏幕并让您重新绘制它。您还可以使用 terminfo 或 termcap 来获得更抽象和通用的接口,但实际上,除了 VT100 的扩展和 ANSI 颜色之外,没有人再使用其他任何东西了。

    确保您的终端字体包含您要使用的画线字符! DejaVu Sans Mono 是一种出色的等宽字体,尤其是它对 Unicode 的覆盖。此外,您可以使用locale 命令检查您的区域设置是否正确;您看到的语言环境名称应以 .utf8 或 UTF-8 之类的形式结尾。

    【讨论】:

    • UTF-8 字节顺序标记是多余的,not recommended。 MS 是第一个用它搞砸一切的人。
    • 我在这个特定的上下文中推荐它们,C/C++ 源文件。旧版本的 MS Visual Studio 会将任何没有源文件的源文件解释为在本地代码页中编码,因此现实世界的编译器需要一个。在现代编译器中,带有 BOM 的 UTF-8 是可以正常工作的格式。有一些较旧的工具在 BOM 上存在问题,但那些可能也会在文件中出现 Unicode 问题。
    • 正如我所说,“MS 是第一个用它搞砸一切的人。”几乎所有非 MS 的东西都可以在没有它的情况下很好地处理它,并且很多东西都会与它混淆(或者只是将其视为常规字符)。从逻辑上讲,添加 BOM 是没有意义的,因为 UTF-8 没有多个有效的字节顺序。如果 MS 想要具有可识别编码的纯文本文件,他们应该提出一个实际指定编码的标准,这也适用于许多其他编码,而不是做一些无意义的事情。
    • 对,所以有时您必须使用 UTF-8 BOM。 VS 2017 将尝试自动检测字符集,如果它有 BOM,它将始终成功。 VS 2015 会将源文件解释为在本地代码页中编码,除非它包含 BOM 或您使用命令行选项覆盖。以前版本的 VS 不支持这样的命令行选项; BOM 是让 UTF-8 源代码与它们一起编译的唯一方法。其他支持 UTF-8 字符串文字的编译器将正确读取 BOM。
    【解决方案3】:

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

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

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

    有点老了,但是看看这里的窗口示例代码:

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

    【讨论】:

      【解决方案4】:

      您正在寻找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");    // └━─┘
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-27
        • 2013-09-14
        • 2014-12-23
        • 2010-10-06
        • 2020-02-24
        • 2023-03-19
        • 2014-06-18
        相关资源
        最近更新 更多