终端:显示特殊字符

Mar*_*ter 16 terminal character-encoding

在某些程序中,如htop线条和框架显示不正确。相反,它们显示为-/

在此处输入图片说明

但在另一台机器上,它们正确显示为正确的行:

在此处输入图片说明

我不确定这是否是终端问题,或者是否需要某些软件包。

如果相关:我的系统是 Debian Wheezy,我的解释器是bash,我的终端模拟器是gnome-terminal

rae*_*hik 12

您最上面的示例是使用非 Unicode 语言环境(即 ASCII)运行的。检查您的 $LANG 环境变量(尝试export | grep LANG);您很可能找不到.UTF-8后缀。尝试添加它:

export LANG=$LANG.UTF-8
Run Code Online (Sandbox Code Playgroud)

您的另一个示例使用 UTF-8 语言环境运行,这应该是最近 shell 的默认设置。它似乎htop可以检测您的语言环境并显示 ASCII 或 Unicode 字符 - 所以在底部图片中,您会得到很好的 Unicode 字符,而使用 ASCII 则会得到一些非常临时的字符。我建议将顶部图片机器的语言环境更改为 Unicode语言环境(请参阅语言环境 - Debian Wiki)。

如果这不起作用,则可能是您的终端模拟器有问题。默认编码可以是非 Unicode。将终端模拟器的默认编码更改为 UTF-8(xfce4-terminal我在“高级”选项卡中找到了它)。如果不能,则可能是您当前的字体不支持 Unicode:尝试将字体更改为 Unicode 字体。

[奇怪的是,我发现一旦我在 shell 会话中将我的语言环境更改为 ASCII,htop总是显示 ASCII 字符,即使在将其更改回来之后也是如此。这可能是您的问题,如果出于某种原因您偶尔会在 shell 中更改您的语言环境。]


Tho*_*key 5

奇怪的是htop使用 ncurses,它可以使用/不使用 Unicode 绘制线条。但是,查看中的源代码CRT.c显示了解释:

#ifdef HAVE_LIBNCURSESW
   if(strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
      CRT_utf8 = true;
   else
      CRT_utf8 = false;
#endif

   CRT_treeStr =
#ifdef HAVE_LIBNCURSESW
      CRT_utf8 ? CRT_treeStrUtf8 :
#endif
      CRT_treeStrAscii;
Run Code Online (Sandbox Code Playgroud)

CRT_treeStrUtf8

const char *CRT_treeStrUtf8[TREE_STR_COUNT] = {
   "\xe2\x94\x80", // TREE_STR_HORZ ?
   "\xe2\x94\x82", // TREE_STR_VERT ?
   "\xe2\x94\x9c", // TREE_STR_RTEE ?
   "\xe2\x94\x94", // TREE_STR_BEND ?
   "\xe2\x94\x8c", // TREE_STR_TEND ?
   "+",            // TREE_STR_OPEN +
   "\xe2\x94\x80", // TREE_STR_SHUT ?
};
Run Code Online (Sandbox Code Playgroud)

但是,ncurses(任何curses 实现)具有可移植的符号,这些符号不依赖于编码是否为UTF-8。一些应用程序(例如dialog--ascii-lines选项)提供了使用 ASCII 线绘制的选项,但是一个甚至不尝试使用 ncurses 中提供的线绘制的应用程序并没有有效地使用该库。

简而言之,当您遇到这样的程序时,您应该将其作为错误报告给开发人员。

进一步阅读: