gpt4 book ai didi

c - ncurses如何输出非ascii字符?

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:33 27 4
gpt4 key购买 nike

我想知道 ncurses(一个 c 库)如何设法放置像 这样的字符,尽管它们(据我所知)不是 ASCII 的一部分。

我原以为它只是逐个像素地绘制它们,但您可以将它们复制/粘贴到终端之外(在 MacOS 中)。

最佳答案

ncurses 通过假定您的语言环境变量(LC_ALL 和/或 LC_CTYPE) 匹配您正在显示的终端。环境变量指示编码(例如,UTF-8)。还有其他编码和支持这些编码的终端,但一般来说,您大多会看到 UTF-8。如果环境和终端配合,事情就会“正常工作”:

  • 在启动时,ncurses 通过 setlocale 检查程序初始化的语言环境,并确定它是否使用 UTF-8。它稍后会使用该信息。
  • 当程序添加字符串时,例如使用 addstr,ncurses 使用字符类型信息(设置为调用 setlocale 的副作用),并使用标准 C 库函数,用于组合构成多字节字符的字节序列,并将它们转换为宽字符。它在内部存储那些宽字符,并且
  • 当写入终端时,ncurses 会反转这个过程,从宽字符转换为使用终端支持的编码假设(假设您的语言环境与终端匹配)。

但是——

表示的字符恰好是一个特例。这是用于画线的图形字符之一,早于 Unicode 和 UTF-8。 curses 有这些图形字符的名称,使引用它们变得简单,例如,ACS_LTEE(是左发球座):

  • 在 UTF-8 出现使事情变得复杂之前,开发人员通过调整用于 VT100(1970 年代后期)和 AT&T 4410 和 5410 终端(显然是早期的1980 年代,因为后者在 1984 年被使用)来绘制他们的图形字符。
  • AT&T SystemV curses 从 20 世纪 80 年代中期开始为这些图形字符提供支持。 BSD 诅咒从来没有这样做过......
  • Unicode(大约 1990 年及以后)使用不同的编码提供了大部分相同的字形。有一些遗漏(最明显的是水平线上方/下方的扫描线),但是一旦 UTF-8 在 2000 年代初期投入使用,扩展 ncurses 就合乎逻辑了使用这些字符。
  • ncurses 查看语言环境设置,但更喜欢对这些图形字符使用终端描述,除非已知它不起作用——并且将假设终端可以显示 Unicode 等价物如果假定终端使用 UTF-8,则这些字符。它为此目的使用了一个表(SystemV curses 及其继任者 X/Open Curses 没有做任何这件事——NetBSD curses 在 2010 年之后的某个时候从 ncurses 改编了该表)。

进一步阅读:

关于c - ncurses如何输出非ascii字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43671649/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com