按原样打印二进制数据而不破坏终端

按原样打印二进制数据而不破坏终端

我写过Python 模块倾倒物体。但是,当将其与numpy.ndarraylinux终端 ( ) 中保存二进制数据(例如 )的对象一起使用时TERM=linux,打印出数据会导致终端的字体中断 - 显然,某些字符被视为终端控制序列。在 Windows 中,即使在 Cygwin 的mintty终端中,打印也可以正常工作(尽管如此TERM=xterm)。

cat当我使用二进制文件时也会发生同样的情况。

当然,我可以用 来解决这个问题reset,但代价是失去输出,而且通常很不方便。虽然我知道大多数(如果不是全部)控制字符在字体中都有替代图形表示(例如,对于CR,它是)。

所以,有没有办法改变原始流,使linux终端将其中的特殊字符视为文字?基本上,我希望看到这样的东西:

二进制数据打印输出示例

我主要对编程方式感兴趣(=从终端的角度需要做什么,以及公共系统库中的实现(如果有的话)); shell 中的方式将是一个优点。

Pythonrepr()不符合我的需求:它将任何不可打印的 ASCII 字符扩展为可变长度序列,包括国家字母,而该模块的设计目标是使转储打印输出简洁易读。

答案1

showconsolefont程序可以显示 256 个不同的(或 512 个不同的......)字形立即在 Linux 控制台上。但它使用系统调用来完成此操作(这恰好仅适用于与控制台设备的连接)。它的手册页没有提到这一点。

字形(用于显示字符)与人物。您可以通过在终端上打印来显示字符,然后终端将其映射到字形。没有转义序列可以告诉 Linux 控制台将控制字符视为可打印。

例如,showconsolefont实际上并不单元格 0-31 的控制字符。它地图使用(您猜对了)系统调用将可打印字符转换为 0-31 范围。

进一步阅读:

答案2

我不知道有什么方法可以改变终端接受所有字符。控制字符是特征程序的职责通常是注意终端类型,为它想要使用的终端功能生成正确的控制字符,并转义它想要打印的任何控制字符。

例如,可以在以下位置找到如何更改 Python 程序来执行此操作的信息:堆栈溢出问题。

在 shell 中,您可以使用 egtr将控制字符转换为其他 ASCII 字符(尽管不是 unicode 字符)。看关于可以使用 unicode 字符的替代方案的问题。

统一码定义了一个控制画面组显示控制字符,例如回车符是。如果从未听说过代表 CR,如果听说过,那么这在您碰巧使用的某些字体中纯粹是偶然的。

在 shell 中,您不仅仅是cat一个二进制文件,而是使用hexdump -C或类似的方法来检查它。

相关内容