每天改变一点点,生活充满了惊喜。
全部博文(42)
分类: LINUX
2015-03-19 15:59:56
Linux下使用vim编辑文本,特别是有中文时,经常出现乱码。常受其害,不知其然。
当出现这种情况时,时常经过一番倒腾设置,正常了,但总感觉是在碰运气。
抽时间研究了一些文档、做了一些测试,以下Linux 、 vim、XShell 环境下UTF-8编码为例,描述下自己的一些理解。
首先,乱码出现的原因,简单的说是文本的字符编解码不一致导致的。
例如:文件使用GBK编码保存,打开时使用UTF-8编码,则必然是乱码。因为GBK 和 UTF-8 使用的编解码规则不一样。
要详细了解字符编码的原理,可以参考这篇文章:
http://blog.jobbole.com/84903/
要做到打开文件后,在终端XShell不出现乱码,需要考虑以下几个方面:
文本自身的编码方式
vim编辑器的编码方式
Linux操作系统的语言环境
XShell终端的解码方式
vim可以在.vimrc配置文件中写入以下配置项来设置编码:
set fileencodings=utf-8,gbk
经过上面的设置,当使用vim打开文本时,就会使用fileencodings指定的编码方式列表去逐一探测文本的编码方式,
并设置fileencoding项为探测到的,fileencoding(注意和fileencodings的区别)配置项表示当前编辑的文本的编码方式,
vim在保存文件时也会使用该编码方式。要注意一点,vim自动探测字符编码的机制不是100%有效的。
如果不设置上面的配置项,vim会默认使用Linux的locale,locale用于设置Linux操作系统的语言环境,
用locale命令可以查看当前操作系统的语言环境,如果不是UTF-8编码,用下面的命令修改:
export LC_ALL="zh_CN.utf-8"
如果不想每次都修改,可以把上面的命令行写入.bashrc文件。
经过设置后,用vim打开文本时,fileencoding值就是utf-8。
根据上面的描述,如果文档使用vim编辑文档并保存后,文档就保存为fileencoding指定的编码方式。
而如果是新建文档,使用fileencodings指定的编码方式列表的第一个值。
经过上面的设置后,在终端XShell上看到的可能仍是乱码,还是不一致的问题。
vim输出字符到终端采用的是termencoding指定的编码方式,termencoding默认值为空,即传输到终端不做编码转换。
那么OK了,两种解决方法,
要么修改termencoding值与终端的字符展示方式一致,要么修改终端的字符展示方式为utf-8。当然这里肯定推荐后者。
总结:
文中采用的是比较常用的方式,毕竟utf-8在Linux操作系统下是比较常用的字符编码方式,如果要设置为其他字符编码方式也是类似的。
解决字符乱码的问题的方法很多,重要的一点是要保持字符的编解码一致,而且要知道在哪个环节,是哪种字符编码方式在起作用。
还有就是需要了解下字符编码的规则和原理,处理这类问题就能游刃有余了。