终端:显示特殊字符


11

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

在此处输入图片说明

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

在此处输入图片说明

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

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


您是否尝试过更改终端使用的字体?
goldilocks 2013年

2
如果将诸如方框或问号之类的占位符替换为Unicode字符,那将是一个可能的解决方案,但他的示例显示了htop显示ASCII字符。但是,如果默认终端字体是非Unicode字体,那么编码也是可能的,因此我将其添加到了答案中。
raehik 2013年

Answers:


11

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

export LANG=$LANG.UTF-8

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

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

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


3

奇怪的是,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。某些应用程序(例如dialog--ascii-lines选项)提供了使用ASCII线条画的选项,但是什至没有尝试使用ncurses中提供的线条画的应用程序也无法有效利用库。

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

进一步阅读:


虽然它不能直接解决我的问题(在中设置LANG/ LC_ALL启用预期的Unicode线条绘制字符htop),但这非常有趣。感谢您抽出宝贵的时间来解释它!
wrksprfct
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.