在某些程序中,例如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;
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 中提供的画线的应用程序都没有有效利用该库。
简而言之,当您遇到具有类似行为的程序时,您应该将其作为错误报告给开发人员。
进一步阅读:
- 线条图形(ncurses addch 手册页)
border
,wborder
,box
,hline
,whline
,vline
,wvline
,mvhline
,mvwhline
,mvvline
,mvwvline
-创建诅咒边框、水平线和垂直线dialog
截图(没有任何需要 UTF-8 编码才能使用线条绘制)