我已经尝试了在论坛中可以找到的所有方法,并且无法在 kubuntu 18.04 下的 xterm 窗口中显示任何 8 位字符(也不在早期版本中)。0x20-0x7e 范围内的所有字符都按预期显示,但 0x80-0xfe 范围内没有。当我尝试时,根据设置,我会得到一个空白或黑色椭圆形问号的默认字形。我的简单测试是:
回声 -e '\xa2 \xa3'
这些是字符 162 和 163(十进制),在西方字体中应显示为分号和英镑。我尝试了超过 128 (= 0x80) 的字符选择,结果相同。我测试过的不同调整:
将语言环境设置为 UTF-8 风格。
设置为 UTF-8 编码(例如 en_US.UTF-8)。
启动 xterm 时调用不同的字体,所有字体都有完整的 128-255 个字符集。
尝试了uxterm和xterm。
除了简单的echo -e测试之外,还使用了显示完整字体网格或调用适当的 vt-100 esc 命令序列和字符串的测试程序。例如:
转义('<' (将 DEC 补充字符集加载到 G1 中)
ctrl-N (移出,将 G1 加载到“左半”GL 集中)
\x32 \x33
在所有情况下,只有默认的“?” 显示字形。
很多其他人写过类似问题的论坛,并通过上述列表的调整得到解决。没有一个对我有用。
我正在运行 32 位 kubuntu,而不是 64 位。这可能是问题的一个因素吗?
我们有一个自定义程序,它使用 curses 工具调用基于 xterm 的编辑器,它至少显示 128-255 范围内的一个字符。该字符在 Sun Solaris 下运行良好,但在带有 ncurses 的 kubuntu linux 中显示为空白。恢复那个字形是让我追逐这个目标的原因。
我将不胜感激任何帮助,并乐于提供任何和所有细节。
非 ASCII 字符使用不同的编码。较旧的 ISO-8859-x 编码每个字符使用一个字节。您的示例中的字符 cent 和 pound 使用八位字节
0xa2
和0xa3
ISO-8859-1 (Latin1) 字符集进行编码。UTF-8 使用可变长度方案,其中分字符被编码为两个八位字节序列0xc2 0xa2
,而磅字符被编码为0xc2 0xa3
.要正确显示字符,您需要设置区域设置以匹配您要显示的文本中使用的字符编码。您必须将语言环境设置为 ISO-8859-1,或者将您的文本文件重新编码为 UTF-8。
UTF-8 优于 ISO-8859-x 编码的优势在于 UTF-8 涵盖了整个 Unicode 范围,而旧的 8 位编码仅涵盖 192 个可见字符。
您的 shell 的语言环境设置是问题的一部分:
这告诉在xterm中运行的应用程序使用 UTF-8。UTF-8 编码使用 0x80-0xff 范围内的代码来构建多字节字符,这不是您想要的。
启动xterm时生效的语言环境会影响它解释相同代码的方式。如果该语言环境告诉 xterm 它使用 UTF-8,xterm 将使用 UTF-8 编码(请参阅语言环境资源),并且根据资源设置,可能不允许您将其关闭。(在桌面环境中运行 xterm 时,这尤其是一个问题,您的系统语言环境使用 UTF-8,例如,
en_US.UTF-8
)。您可以使用控制鼠标右键菜单查看 xterm 正在执行的操作:有一个条目“UTF-8 编码”,当它需要 UTF-8 时会被选中,当您无法更改它时会灰显。如果您的 shell 初始化使用系统的语言环境设置,那么从命令行执行此操作就足够了:
您似乎要问的是 ISO-8859-1 和相关编码,而不是 UTF-8。这些是没有后缀的语言环境名称
".UTF-8"
通常指的。这是来自vttest的屏幕截图,说明了 ISO-8859-1(对于您尝试使用的应用程序,您可能希望看到):
这就是 UTF-8 编码所显示的内容
ncurses 库检查语言环境(调用应用程序应该已初始化)并发现 0x80-0xff 中的那些单个字节不形成完整的多字节 UTF-8,并显示空白。但是,如果您的区域设置(和终端)设置一致,您将看到预期的字符。
另一方面,您的问题提到了DEC Supplemental。这是不同的,因为它依赖于 xterm 的 Unicode 支持(使用National Replacement Character Sets中的所有可用字符)。Latin-1 以 1-1 映射到 Unicode,但DEC Supplemental(很像 Latin-1)不是。
NRCS(国家替换字符集)作为xterm中的一种模式提供。(原始硬件终端使用设置选择)。如果您的应用程序实际上使用了DEC Supplemental(很像 Latin-1),您可能会看到类似这样的内容(vttest 突出显示它与 Latin-1 不匹配的地方):
或者它可能使用DEC 补充图形(同样,类似):
无论哪种方式,xterm 都可以做到这一点(启用 UTF-8)。但是,对于 Ubuntu 分发的非常旧的版本,您可能必须编译自己的程序。但在问题的上下文中,您似乎实际上使用的是 Latin-1 而不是这些较旧的预标准字符集。