【问题标题】:ncurses A_ALTCHARSET characters not displaying on OSXncurses A_ALTCHARSET 字符不在 OSX 上显示
【发布时间】:2016-06-11 22:13:09
【问题描述】:

我在 c++ 程序中使用 ncurses,并希望能够使用 A_ALTCHARSET 字符。在我的 linux 计算机上它工作正常,但是当我在我的 Mac 上尝试它时,几个字符显示为“?”。作为测试,我在我的两台计算机上运行了来自this website 的第二个程序。在我的 linux 计算机上,它正确显示了所有字符,并且显示的内容与网站上的图片相同,但在我的 mac 上,我得到了:

                                NCURSES ALTCHARSET CHARACTERS
     43 = > │  44 = < │  45 = ^ │  46 = v │  48 = # │  96 = ◆ │  97 = ▒ │ 102 = °
    103 = ± │ 104 = # │ 105 = ␋ │ 106 = ┘ │ 107 = ┐ │ 108 = ┌ │ 109 = └ │ 110 = ┼
    111 = ⎺ │ 112 = ⎻ │ 113 = ─ │ 114 = ⎼ │ 115 = ⎽ │ 116 = ├ │ 117 = ┤ │ 118 = ┴
    119 = ┬ │ 120 = │ │ 121 = ≤ │ 122 = ≥ │ 123 = π │ 124 = ≠ │ 125 = £ │ 126 = ·
    128 = ? │ 161 = ? │ 162 = ? │ 163 = ? │ 164 = ? │ 165 = ? │ 166 = ? │ 167 = ?
    168 = ? │ 169 = ? │ 170 = ? │ 171 = ? │ 172 = ? │ 174 = ? │ 175 = ? │ 176 = ?
    177 = ? │ 178 = ? │ 179 = ? │ 180 = ? │ 181 = ? │ 182 = ? │ 183 = ? │ 184 = ?
    185 = ? │ 186 = ? │ 187 = ? │ 188 = ? │ 189 = ? │ 190 = ? │ 191 = ? │ 192 = ?
    193 = ? │ 194 = ? │ 195 = ? │ 196 = ? │ 197 = ? │ 198 = ? │ 199 = ? │ 200 = ?
    201 = ? │ 202 = ? │ 203 = ? │ 204 = ? │ 205 = ? │ 206 = ? │ 207 = ? │ 208 = ?
    209 = ? │ 210 = ? │ 211 = ? │ 212 = ? │ 213 = ? │ 214 = ? │ 215 = ? │ 216 = ?
    217 = ? │ 218 = ? │ 219 = ? │ 220 = ? │ 221 = ? │ 222 = ? │ 223 = ? │ 224 = ?
    225 = ? │ 226 = ? │ 227 = ? │ 228 = ? │ 229 = ? │ 230 = ? │ 231 = ? │ 232 = ?
    233 = ? │ 234 = ? │ 235 = ? │ 236 = ? │ 237 = ? │ 238 = ? │ 239 = ? │ 240 = ?
    241 = ? │ 242 = ? │ 243 = ? │ 244 = ? │ 245 = ? │ 246 = ? │ 247 = ? │ 248 = ?
    249 = ? │ 250 = ? │ 251 = ? │ 252 = ? │ 253 = ? │ 254 = ? │ 255 = ? │ 

为什么这不起作用,有办法解决吗?

【问题讨论】:

    标签: c++ linux macos ncurses


    【解决方案1】:

    在终端中,转到“首选项”,然后转到“配置文件”,然后单击“高级”选项卡。在高级中,选择 Text Encodings 的下拉菜单,然后选择 Western (Mac OS Roman)。我确定其他编码具有您缺少的字符 - 但那个对我有用。

    【讨论】:

    • 这不适用于其他字符,因为语言环境编码可能是 UTF-8。
    【解决方案2】:

    这看起来好像您做了类似将TERM 设置为linux 的操作。 Linux 控制台提供了一种非 VT100 方法来绘制线图(主要使用 160-255 的代码)。 OSX 终端实现了一个 VT100 风格的线条图形,它需要切换字符集。如屏幕截图所示,linux 不是您可以使用终端首选项进行的设置之一。然而,人们在他们的.bashrc 等中设置变量并不罕见:

    该区域的终端描述(由TERM 环境变量选择)不同。推荐用于 OSX 终端的 TERM 是 ncurses 中的 nsterm 风格之一。比较:

    $ infocmp linux nsterm |grep acs
            acsc: '+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i\316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376', '``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~'.
            enacs: NULL, '\E(B\E)0'.
            rmacs: '\E[10m', '^O'.
            smacs: '\E[11m', '^N'.
    

    VT100 风格功能中的smacsrmacs 字符串称为shift-inshift-out(用于法线和图形)。如您所见,它们与 Linux 功能不同。

    进一步阅读:

    要查找的特征是您的程序在 shell 中使用的 TERM 的值。 OSX 终端只有一种可能的行为(不匹配“linux”)。该程序确实有一个设置TERMPreferences 对话框,尽管您的shell 可能会明确地将其设置为其他值。 例如,终端数据库指出

    # * The terminal preferences dialog replaces xterm-color by xterm-16color and
    #   xterm-256color.  However, it adds "nsterm", so it is possible to use the
    #   nsterm entry from this file to override the MacPorts (20110404) or
    #   system (20081102) copy of this file.
    # + In OS X 10.8 (Mountain Lion) the TERM which can be set in the preferences
    #   dialog defaults to xterm-256color.  Alternative selections are ansi,
    #   dtterm, rxvt, vt52, vt100, vt102, xterm and xterm-16color.  However,
    #   the menu says "Declare terminal as" without promising to actually emulate
    #   the corresponding terminals.  Indeed, changing TERM does not affect the
    

    以上内容写于 2016 年 2 月。ncurses 和 Linux 的开发正在进行中。在May 2016 中,对 ncurses 的终端数据库进行了此更改:

    # 2016-05-14
    #       + modify linux2.6 entry to improve line-drawing -TD
    #       + make linux3.0 entry the default linux entry (Debian #823658) -TD
    

    这使得标准的 linux 终端描述在该区域看起来更像 nsterm。如果您在最新系统上运行 infocmp,您将看不到显示的差异。然而,Apple 并没有那么快地更新 ncurses。 linux2.2 终端描述是在原始问题的上下文中使用的。这是显示带有该终端描述的 ncurses 测试程序的屏幕截图:

    现在……Apple 可能已经赶上了 Mohave,但目前还没有可靠的测试结果。对于 High Sierra,Apple 对 linux 的终端描述仍使用旧版本的图形字符,如下图所示:

    现在...如果您使用的是 MacPorts 或 brew,结果会有所不同:

    • 那些添加的终端数据库较新,并且
    • 较新的数据库中的一个特性是 linux 终端描述使用U8 extension,它告诉 ncurses 假设它应该在语言环境编码为 UTF- 时使用 UTF-8 8.如果您遇到这种情况,您将看不到最初的问题。

    【讨论】:

    • 我尝试将 Terminal->Preferences->Profiles->Advanced->Terminfo 设置为 nsterm、ansi、dtterm、rxvt 和 xterm,但它们都不起作用。
    • 这与设置 TERM (环境变量)无关,如果您的 shell 设置它,如我的回答开头所建议的那样。
    猜你喜欢
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多