检测我的终端支持多少 Unicode,即使通过屏幕

Ále*_*lex 11 linux terminal tty unicode

问题是:我希望能够辨别我的终端是否能够使用像样的 unicode,以便使用某些字符,就像扫视一样,有时使用颜色和其他下划线。

动机的出现是因为在任何类型的虚拟终端中我都能获得不错的字体,但我知道基本的 Linux 控制台具有 256 或 512 个同时符号的字符集,因此您不能指望完全支持字体。

起初我以为我可以使用$TERM或 tty,但这里有一个问题:我也在使用 byobu,所以$TERM总是“screen.linux”。tty 的输出也不是很能说明问题:/dev/pts/<some number>在“真实”和虚拟方面。

$BYOBU_TTY也没有帮助,因为例如它可能是/dev/tty1并且当会话在Ctrl+ Alt+ 中打开时,F1字符不显示,但是当从某个 X 术语附加到同一个会话时,它们显示正确并且仍然$BYOBU_TTY不会改变。此外,我希望能够在不假设 byobu 存在与否的情况下检测到这一点。

此外,语言环境在所有情况下都显示 en_US.UTF-8

然而不知何故,即使在 byobu 内部,也以某种方式瞥了一眼(以命名我看到的特定工具),根据我附加到 byobu 会话的终端使用不同的输出。

我在使用 google 时遇到了麻烦,因为终端和 tty 似乎是太常见的搜索词。我最多得到推荐$TERM或 tty 的解决方案。

Cel*_*ada 9

好吧,首先我想我会指出,现在几乎所有终端在您所说的意义上都是“虚拟的”……即使终端位于真正串行端口的另一端。我的意思是,VT-100Wyse终端和其他“物理”、“真实”终端的时代已经一去不复返了!

除此之外,假设您想检测终端具有哪种 Unicode 支持。您可以通过将测试字符写入 is 并查看会发生什么来做到这一点。(您可以在写入之后努力擦除测试字符,但用户可能仍会短暂地看到它们,或者擦除它们可能无法正常工作。)

这个想法是让终端告诉你它的光标位置,输出一个测试字符,再次让终端告诉你它的位置,然后比较两个位置,看看终端的光标移动了多远。

要询问终端的位置,请参见此处。本质上:

echo -e "\033[6n"; read -d R foo; echo -en "\nCurrent position: "; echo $foo | cut -d \[ -f 2
Run Code Online (Sandbox Code Playgroud)

尝试输出“é”。此字符在 UTF-8 中占用 2 个字节,但仅显示在屏幕上的一列中。如果您检测到输出“é”会导致光标移动 2 个位置,则终端根本不支持 UTF-8,并且可能输出了某种垃圾。如果光标根本没有移动,那么终端可能只是 ASCII。如果它移动了1个位置,那么恭喜,它可能可以显示法语单词。

尝试输出“?”。该字符在 UTF-8 中占用 3 个字节,但在屏幕上仅显示在两列中。如果光标移动了 0 或 3,则为坏消息,与上面类似。如果它移动 1,那么它看起来像终端支持 UTF-8 但不知道宽字符(在固定宽度字体中)。如果它移动了 2 列,一切都很好。

我确定您可以发出其他探测字符,这些字符会导致有用的信息。我不知道自动执行此操作的工具。