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 中更改您的语言环境。]
奇怪的是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)
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 中提供的线绘制的应用程序并没有有效地使用该库。
简而言之,当您遇到这样的程序时,您应该将其作为错误报告给开发人员。
进一步阅读:
border
, wborder
, box
, hline
, whline
, vline
, wvline
,
mvhline
, mvwhline
, mvvline
, mvwvline
-创建诅咒边框、水平线和垂直线dialog
截屏(没有需要UTF-8编码来使用画线)