终端:显示特殊字符

终端:显示特殊字符

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

在此输入图像描述

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

在此输入图像描述

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

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

答案1

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

export LANG=$LANG.UTF-8

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

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

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

答案2

奇怪的是它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;

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 ─
};

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

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

进一步阅读:

相关内容