linux 下vi乱码问题总结

  在linux开发,经常会遇到用vi打开一个文件在终端显示为乱码的情况,这里对这个问题进行一个总结。

出现乱码可能是以下三种情况:
1. 文件本身乱码,也就是说文件保存的内容已经是乱码了
比如文件有中文字符,但是却以iso-8859-1的编码保存文件。这种情况的乱码是无法恢复的
2. vi工具解析文件使用的编码不对
例如文件本身使用gbk编码,vi却以utf-8的方式去读取文件
3. 源文件没有乱码,并且vi也正确的读取文件,但终端显示是乱码
这是由于终端设置的编码方式不对,造成显示到屏幕上的内容是乱码

所以,如果要保证linux终端显示正确,需要确保以上三个阶段的编码正确性。
文件本身编码的正确性,只能由作者控制了,一旦乱码可能会导致信息丢失,例如中文字符使用拉丁编码保存。一般建议使用utf-8编码。

vi工具的编码需要在.vimrc中进行设置,主要设置参数如下:
set encoding=utf-8 (vim内部使用的编码)
vim工作时候,所有的buffer、寄存器和脚本字符串等都使用这个编码;如果文件内容编码和encoding不同, vi会把文件转码然后把内容存入buffer中;如果encoding的编码不足够强的话,可能出现信息丢失情况。例如文件编码为utf-8切包含了gbk无法表示的字符,encoding设置为gbk,此时将无法正确完成转码,无法转换的部分将出现数据丢失情况。因此我们建议encoding一定要设置一个表现力足够强的编码,一般设置为utf-8编码

set termencoding=utf-8 (vim把内部编码的内容输出到终端的编码,简称终端编码)
如果encoding和termencoding设置不同,vi会尝试把encoding编码的内容转换为termencoding编码后输入到终端
所以如果确保可以正确的显示内容,我们需要保证termencoding编码表现能力强于或者等于encoding编码的表现力,建议二者设置相同。
如果没有设置termencoding,则默认termencoding=encoding;如果有些字符不能正确从内部编码转换到终端编码,则会显示问号,但是可以完成对内容编辑。

set fileencoding=utf-8 (文件编码,即文件内容以fileencoding编码保存到硬盘上)
vi打开一个文件会自动探测文件编码,如果fileencoding编码和encoding编码不同,vi会把文件内容从fileencoding转换为encoding编码。
当打开文件后vi会设置文件编码为fileencoding,当保存文件内容时如果fileencoding!=encoding,vi会尝试把encoding编码的内存中数据转换为fileencoding编码保存到磁盘上。因此只要fileencoding和encoding的编码表现力可以表示文件字符,既不会出现信息丢失问题;否则会出现数据丢失问题。

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1(文件编码探测列表)
vi打开一个文件有一个自动探测文件编码的阶段,自动探测文件编码就是fileencodings参数设置的,这个列表表示vi探测编码的顺序,从左到右顺序探测;如果探测成功则设置fileencoding为此时的编码,如果失败则继续下一个探测。 因此我们应该把编码格式要求严格的、容易解码失败的编码方式放在前面,编码格式要求宽松的放在后面,从而提高探测正确率。 如果把latin1编码放在最前面,则打开任何文件都不会解码失败,但vi首先会对中文编码的内容解码成latin1到内存中(此时内从中的内容已经是乱码了),然后再由latin1转换为encoding编码存入vi的buffer中,此时buffer中的内容自然也是乱码;最后显示到终端的内容自然也肯定是乱码了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值