当我们写的程序含有控制台(Console)输出时,如果输入内容包含中文时,我们一般需要知道下面的信息,才能正确的搞清楚怎么处理中文显示的问题:
1、实际程序或文件中的实际编码:
Linux下的应用程序和文本文件,它们包含中文时,使用的编码并不一定都是UTF-8,多数也都是GBK/GB2312等编码。
一般的,不管是什么编码,程序和文本编辑/显示命令一般都能正确识别,并将正确的中文汉字输出到SHELL控制台中。
2、SHELL控制台接受SSH工具/Telnet工具等终端软件的连接后,会将SHELL控制台中输出的文本信息重定向输出通过网络传回客户端,在传回客户端之前,会重新对文字信息进行编码。
此时,这个编码就跟文本文件或应用程序实际的编码并不一定是一致的了。
客户端工具只需要确定Shell传过来时采用的编码是什么,而并不关心实际的文件内容中的编码,除非是通过SFTP等文件传输方式传输过来的。
默认情况下,Linux的Shell在传送控制台的信息过来时,默认是采用UTF-8编码传输的,所以,咱们的SSH工具,比如VxTerm中,只要建立会话时,设定“对端编码”是UTF-8,保持与Shell设定的传输编码一致就可以了。
所以,这里会有一些与一般的文章所写的内容不一样。客户端SSH工具,一般并不关心文件的实际编码,而是Shell TTY控制台通过连接传输过来的编码。
默认都是 LANG=zh_CN.UTF-8
而实际上很多编辑和显示工具,都能正确的显示不同编码的文本文件中的中文汉字,那是因为这些工具自带了编码识别功能,用以保证能正确的在Shell控制台中显示出中文。
如果您的文本文件file的编码是GB2312,但是您希望执行的命令如:catu file并不能识别这种编码时,经它识别后输出到控制台的本就是乱码,所以再通过UTF-8转码后再传过来到客户端这边当然也会是乱码。在这种情况下,如果通过配置客户端中的“对端编码”为GB2312或许是能正常的显示,但这种做法并不是最好的。正确的方法是应该使用可以识别不同编码的命令去把它给输出到控制台中。
在VxTerm中可以很方便的设定对端的编码:
我们可以在快速连接会话的窗口中,在建立会话信息时选择编码,或者是在已建立的会话中,打开右边的会话选项,选择“对端编码”,正常情况下就能显示中文:
比如,我们在本地建立了一个big5txt.txt文件,文件的编码为big5,文本内容为:
中華人民共和國
上传到linux服务器后,当我们本地设定的对端编码为UTF-8时,cat big5txt.txt的结果:
这是由于cat并不能识别和转换big5编码到Shell中,所以我们收到的是乱码。当我们把VxTerm的对端编码设为big5后,就能正常显示了:
但此处我们能正常显示,那是因为cat 这条命令会把文件的编码按原样不经转换的直接输出到了控制台中,所以我们可以通过big5编码来接收,并在VxTerm这边可以正确的把它还原。
而如果使用vim来打开big5txt.txt,于默认情况下vim采用的读取文本的组件不能识别其正确的内码并显示在它的应用程序中,其采用的文本读取组件就按默认的latin1编码来解析并显示,此时不管我们本地选择什么样的编码,都无法正常显示其文本内容,就会出现所谓的乱码:
同样的,如果我们产生的文件是gb2312编码的ansitxt.txt,此时,如果VxTerm客户端选择UTF-8,使用cat ansitxt.txt显示出来的也是乱码,选择default(仅在中文简体操作系统下)编码或者是gb2312,就能正常的cat显示
但是在vim中,由于vim默认是不支持gb2312的,可以通过下面的方法解决:
vi ~/.vimrc
set fileencodings=utf-8,gb2312,gbk,ucs-bom
set encoding=utf8
保存后,我们再打开 vi ansitxt.txt,此时,由于vim已能正确识别gb2312编码,所以VxTerm还得要设置“对端编码”为utf-8,就能正确的识别和编辑了。
从这里就能得知,如果所用的应用程序能正确的识别输出的文字编码到控制台中,那么只要我们保持VxTerm的对端编码与对端系统设定的编码一致,就能正确的显示中文汉字,否则,除非是像cat那样:不能识别的情况下都按照原编码的二进制内容输出,则本端按照文件的编码设定就能显示。