ubuntu 18.04 中 xterm 无法显示 8 位字符

ubuntu 18.04 中 xterm 无法显示 8 位字符

我已经尝试了在论坛中可以找到的所有方法,并且无法在 kubuntu 18.04 下(也不在早期版本中)的 xterm 窗口中显示任何 8 位字符。 0x20-0x7e 范围内的所有字符均按预期显示,但 0x80-0xfe 范围内没有字符。当我尝试时,根据设置,我会得到一个空白或默认的深色椭圆形问号字形。我的简单测试是:

echo -e '\xa2 \xa3'

这些是字符 162 和 163(十进制),在西方字体中应显示为分号和英镑。我尝试选择超过 128 (= 0x80) 的字符,结果相同。我测试过的不同调整:

  • 将区域设置设置为 UTF-8 风格。

  • 设置为 UTF-8 编码(例如 en_US.UTF-8)。

  • 使用调用的不同字体启动 xterm,所有字体都具有完整的 128-255 个字符集。

  • 尝试了 uxterm 和 xterm。

  • 除了简单的回声-e测试,使用显示完整字体网格或调用适当的 vt-100 esc 命令序列和字符串的测试程序。例如:

    转义('<' (将 DEC 补充字符集加载到 G1 中)

    ctrl-N (移出,将 G1 加载到“左半”GL 集中)

    \x32 \x33

在所有情况下,只有默认的“?”显示字形。

很多其他人在论坛上写过类似的问题,并且通过上面列表中的调整解决了问题。没有一个对我有用。

我运行的是 32 位 kubuntu,而不是 64 位。这可能是问题的一个因素吗?

我们有一个自定义程序,它使用curses 工具调用基于xterm 的编辑器,它至少显示128-255 范围内的一个字符。该字符在 Sun Solaris 下运行正常,但在带有 ncurses 的 kubuntu linux 中显示空白。恢复那个字形让我开始了这场追逐。

我将不胜感激任何帮助,并乐意提供任何和所有细节。

答案1

您的 shell 的区域设置是问题的一部分:

  • 将区域设置设置为 UTF-8 风格。

  • 设置为 UTF-8 编码(例如 en_US.UTF-8)。

这告诉内部运行的应用程序xterm使用 UTF-8。 UTF-8 编码使用 0x80-0xff 范围内的代码来构建多字节字符,这不是您想要的。

当您开始xterm 如何影响解释相同的代码。如果该语言环境告诉 xterm 它使用 UTF-8,则 xterm 将使用 UTF-8 编码(请参阅语言环境资源),并且根据资源设置,可能不允许您将其关闭。 (在桌面环境中运行 xterm 时,这尤其是一个问题,您的系统区域设置使用 UTF-8,例如,en_US.UTF-8)。您可以使用 control-right-mouse 菜单查看 xterm 正在做什么:有一个条目“UTF-8编码”当需要 UTF-8 时会进行检查,并且变灰当你无法改变它的时候。

如果您的 shell 初始化使用系统的区域设置,那么从命令行执行此操作就足够了:

LC_ALL=en_US LANG=en-US xterm

您似乎询问的是 ISO-8859-1 和相关编码,而不是 UTF-8。这些是语言环境的名称没有".UTF-8"后缀通常指。

这是来自的屏幕截图测试说明 ISO-8859-1(对于您尝试使用的应用程序,您可能期望看到的内容):

使用 ISO-8859-1 进行 vttest

这就是使用 UTF-8 编码时显示的内容

使用 UTF-8 编码的 vttest

ncurses 库检查语言环境(调用应用程序应该已初始化)并发现 0x80-0xff 中的那些单字节未形成完整的多字节 UTF-8,并显示空白。但如果您的区域设置(和终端)设置一致,您将看到预期的字符。


另一方面,你的问题提到DEC 补充。这是不同的,因为它依赖于 xterm 的 Unicode 支持(使用国家替换字符集)。 Latin-1 被 1-1 映射到 Unicode,但是DEC 补充(这很像 Latin-1)不是。

NRCS(国家替换字符集)作为模式在 xterm 中。 (原来的硬件终端使用的是设置选择)。如果您的应用程序实际使用DEC 补充(这很像 Latin-1)你可能会看到类似这样的东西(vttest 突出显示它与 Latin-1 不匹配的地方):

带 DEC 补充的 vttest

或者它可能会使用DEC 补充图(再次,类似):

vttest 与 DEC 补充图形

无论哪种方式,xterm 都可以做到这一点(启用 UTF-8)。然而,对于 Ubuntu 分发的非常旧的版本,您可能必须编译自己的程序。但在问题的上下文中,您似乎实际上使用的是 Latin-1 而不是这些旧的预标准字符集。

答案2

非 ASCII 字符使用不同的编码。较旧的 ISO-8859-x 编码每个字符使用一个字节。您的示例中的字符(分和磅)使用八位位组0xa20xa3ISO-8859-1 (Latin1) 字符集中进行编码。 UTF-8 使用可变长度方案,其中分字符编码为两个八位字节序列0xc2 0xa2,磅字符编码为0xc2 0xa3

要正确显示字符,您需要设置区域设置以匹配要显示的文本中使用的字符编码。您必须将区域设置设置为 ISO-8859-1,或者将文本文件重新编码为 UTF-8。

UTF-8 相对于 ISO-8859-x 编码的优势在于 UTF-8 涵盖整个 Unicode 范围,而较旧的 8 位编码仅涵盖 192 个可见字符。

相关内容