乱码!乱码!在linux终端上不小心或不在意cat了一个elf文件,或者仅仅是cat了一个word文档,整个shell就成了乱码,连提示符都不例外,很多人包括我之前都是索性关掉shell,然后重新打开一个shell,这linux的终端未免也太脆弱了吧,一向宣称进程间隔离的linux系统,怎能对待如此重要终端如此如此,盈天地之唯美,只在一草一木之间,然linux却如何做到。
事实上,在彻底解决问题之前,我不得不先为linux平反,首先造成终端乱码的不是linux设计的漏洞,而是用户的有意为之,另外即使用户有意为之,如果你换一下终端类型,cat同样的二进制文件就可能不再乱码,最后,要记住,不是linux本身出了问题,问题在于字符集。
用户的有意为之怎讲?用户并没有对终端进行设置啊!是的,用户没有显式的设置,可是却隐式地进行了设置,此所谓隐式是cat或者vi等“文本”查看/编辑器对终端进行了设置,想理解这个就必须对终端有一个深入的理解,这里不再介绍,需要者自然google之。每个终端为了回显字符必有一个字符集配置,每个终端为了实现功能,必有一个命令解释规范,对于最古老的vt100终端类型来说也是这样,如果很多终端对vt100兼容,vt100有两种字符集设置,称为G0和G1,注意,这G0和G1只是一个中间层,并没有指向最后的字符映射表,用户可以为每一个字符集配置其指向的字符映射表,这字符映射表才最终地进行了字符显示时的解释。我们在解决问题之前先来手动制造一次乱码,解决错误之前首先明白为什么错。要手动制造乱码,由刚刚介绍的理论得知,只要将G0或者G1指向一个错误的字符映射表就可以了,但是怎么做到呢?于是我们就不得不熟悉一下相关的vt100的控制命令了,vt100的控制命令均是以ESC键开头,后面跟一个键序列,比如ESC+[+2+J的意思就是清屏,那么我们测试一下这个清屏命令,用echo -e来测试,esc键是0x1b,于是echo -e '/x1b[2J'就实现了清屏,既然知道了vt100的控制命令写法,我们接下来来一次手工乱码,还是先来一段理论,很多系统用四张字符映射表,分别设为a,b,c,d,一般a为我们使用的映射表,具体这四张映射表分别有何属性,本文不再介绍,请google之,关键词为vt100,那么只要我们将字符映射表设置为b,c,d就可能造成乱码了,我们不妨试一下,配置字符映射表的命令是ESC+(B/0/U/K(G0字符集)和ESC+)B/0/U/K(G1字符集),于是我们来一个echo -e '/x1b(0',看看是不是乱码,如果不是就说明当前的字符集可能是G1,那么就试试echo -e '/x1b)0',很多人看到的结果已经是乱码了,这就说明我们手工成功制造了乱码事件,怎么改回来呢?十有八九是echo -e '/x1b(B'或者echo -e '/x1b)B',注意以上命令可以用重定向的方式进行,比如echo -e '/x1b(0'>/dev/ttyX等等,否则一旦终端乱码了,你也就只能盲打了。
于是,很多问题不用再解释了,cat或者vi本来就不是让你用来处理二进制文件的,以cat为例,它基本就是下面的处理过程:
while(...) {
read(...);
write(..)
}
在write的时候,一旦二进制序列中用上面的echo -e '/x1b(0'(或者U,K)那就麻烦了,cat在你不知道的情况下将'/x1b(0/u/k'写入了终端,而所有人都不能保证你的二进制文件中没有那样的序列,但是如果那是文本文件,除了你指明的转义,一个"/x"一般就被解释成了一个字符串而不是控制字符,也就是说,文本文件的任何处理都是用户指定的,用cat/vi处理二进制文件本身就是误用。在你使用vt100终端的情况下,cat /usr/bin/test试一下吧,然后再echo -e '/x1b(B'恢复之,另外在终端上,我们也可以使用快捷键,比如ctrl+v+n可以将字符集从G0切换到G1,如果G0和G1的字符映射表设置得不同或者不兼容,那么就会出现乱码,用ctrl+v+o恢复之,其实这里的ctrl+v+n/o和/xe//xf是一回事,具体可以查看一下键码的知识。用vi我们也可以测试一下,vi一个文件,然后按ctrl+v,表明接下下插入控制字符,之后按ctrl+n,然后正常输入字符,保存,退出,然后cat该文件,乱之!
好了,这下问题解决了,那么能否彻底解决这个问题呢?事实上可以的,为了防止二进制文件中的转义序列的write写入将G0切换到G1,那么就将G0和G1的字符映射表设置成同一个,为了防止二进制转义序列改变G0或者G1的字符映射表,那么就在每次处理完的时候重新恢复字符映射表的原始设置,不过,最好额办法不是为系统增加系统的鲁棒性,而是让各个程序各司其职,不要误用。还有一种方式就是使用健壮性比较好的终端,比如ansi以及linux终端等等,而放弃使用vt100兼容终端,使用rset程序修改之。
分享到:
相关推荐
"文本文件与二进制文件的差异和应用" 文本文件和二进制文件是计算机存储中的两种基本文件类型。它们的区别不在于物理存储,而在于逻辑上的编码方式不同。文本文件是基于字符编码的文件,常见的编码有 ASCII 编码、...
5. **编程实现**:在编程语言中,如Python,可以使用内置的`open()`函数以二进制模式('wb')打开一个新文件,然后逐行读取文本文件,将每个字符转换为它的二进制表示(使用ord()函数),并写入二进制文件(使用write...
在Java编程语言中,将二进制文件转换为文本文档通常涉及到字符编码的理解和处理。二进制文件可以包含任何类型的数据,如图像、音频、视频或纯文本,但以非可读格式存储。而文本文档通常使用特定的字符编码(如ASCII...
在计算机编程中,文本文件和二进制文件是两种常见的数据存储形式,它们在读写方式上有着显著的差异。本文将深入探讨这两种文件类型及其在C语言中的处理方法。 首先,文本文件是以人类可读的形式存储数据的,通常...
"巧用AWK处理二进制数据文件" AWK是Unix、Linux中处理文本的好工具,可以对复杂的文本文件进行整理,提取其中的全部或者部分数据,按照需要的格式予以显示。但是,AWK的强大功能只针对纯文本文件,对于带有很多不可...
二进制文件srcfile 转换成文本文件 targetfile,16进制显示。 二进制文件srcfile 转换文本文件 targetfile,16进制显示。 二进制文件转换文本文件 targetfile,16进制显示。 二进制文件转换文本文件,16进制显示...
二进制文件处理器兼文件管理器是一款专为用户设计的高效工具,旨在帮助用户管理和操作二进制文件。在计算机科学中,二进制文件是指包含机器可读数据的文件,而非人类可以直接阅读的文本格式。这类文件通常包括程序、...
main2.cpp 生成1个二进制文件。 main3.c 读取二进制文件。 用fgets可以读取指定长度的字符串。 可用于读取格式化固定位址的二进制结构数据。
一个很有用的工具,可以将二进制文件转换为文本文件
本程序要自己创建个文本格式的输入文件a1.txt,编译后能将文本文件前255字节以内的字符转换成相应的AscII码值的二进制表示,并存入输出文件a2.txt中。然后再将二进制文件还原并存入a3.txt文件。 具体代码如下: #...
8. **批量处理**:EditPlus还支持批量处理文件,比如批量转换文件编码或进行特定的文本替换,这对于处理大量二进制文件的场景非常有用。 9. **插件支持**:通过插件,EditPlus的功能可以进一步扩展,满足更多专业...
本文将详细介绍如何在Linux环境下无须格式转换地读取二进制文件,以及如何处理软件包和安装包。 首先,我们要了解二进制文件的本质。二进制文件是由计算机可以直接执行的一系列机器语言指令组成的文件,它们通常不...
文本文件通常使用ASCII或Unicode编码,可被人类直接阅读,而二进制文件则包含机器可读的0和1,通常用于高效的数据存储和传输。在这个场景中,我们要讨论如何将纯文本文件转换为二进制文件,并将其存储在C语言的源...
1:本程序读取二进制文件,并把读到的二进制文件保存为文本数据 2:二进制文件内容一系列的三维点云数据,由扫描仪器扫描获得 3:本程序采用了多线程技术,读取二进制文件时,界面不会卡顿 4:实例二进制文件为data....
在计算机领域,文件可以分为两种主要类型:文本文件和二进制文件。了解如何区分这两种文件类型对于数据处理和程序开发至关重要。文本文件通常由可读的字符组成,如ASCII编码,而二进制文件则包含机器可理解的原始位...
在Fortran语言中处理二进制文件是与处理文本文件非常不同的操作,因为二进制文件的数据以字节形式直接储存,而不通过文本编码来表示。二进制文件通常用于需要精确控制数据的存储方式和节省存储空间的场景。由于二...
在IT领域,我们经常需要处理各种类型的文件,其中包括二进制文件和文本文件。二进制文件通常包含非打印字符,直接阅读困难,而文本文件则以人类可读的字符编码存储信息。"二进制文件To文本转换器"就是一个解决这种...
9. **兼容性与跨平台**:Binary Viewer可能支持多种操作系统,如Windows、Mac OS和Linux,使得在不同环境下分析二进制文件变得容易。 10. **扩展性和自定义**:高级的Binary Viewer可能允许用户通过插件或脚本扩展...
在编程领域,处理二进制文件是一项常见的任务,特别是在系统编程、数据存储和网络通信中。二进制文件与文本文件不同,它们不遵循字符编码,而是直接存储原始的比特流,这使得它们能更有效地存储和传输大量数据。本文...
二进制文件是由0和1组成的原始数据格式,通常包含了计算机程序、图像、音频和视频等非文本信息。BES编辑器允许用户直接打开并编辑这些二进制数据,这对于软件开发者、系统管理员以及数据恢复专家来说极其重要。通过...