今天看服务器的log发现有些文件的中文都是乱码,找了一圈发现是vim设置的问题,因为用less或者cat命令查看log都是正常的,用vim查看才出现的乱码。
编辑~/.vimrc文件,添加
set encoding=utf-8
set termencoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr
set fileencoding=utf-8
保存,然后在用vim查看就正常了。
encoding是设置vim内部的编码方式,大概就是vim内部的缓存 寄存器 脚本什么的,这个用户大可不必关系,除非你在意性能,最好把这三个都设成一致的。
termencoding是vim用于屏幕显示的编码,如果其值与encoding值不一致的话,vim会把encoding编码转换为termencoding编码再输出到屏幕。
fileencodings是vim读取文件时所需要用到的编码方式,vim读取文件时会按先后顺序依次按设置的编码方式来尝试解码文件中的内容,如果符合就用此编码来解码该文件,并会把fileencoding值设置为该编码。上面的编码顺序是从网上找来的,应该没满足大部分需求。(按编码要求的严格顺序来排序)
如果vim从列表中找不到匹配编码的话它就会用系统默认的编码来读取。
fileencoding是保存文件时所用的编码,vim 会把文件内容转换为该格式保存。
中文乱码的原因就是因为这几个编码设置的不同,所以会产生编码转换的错误,如果有条件的话最好把这几个编码统一用utf-8编码就ok了。
后来找了一下我这边乱码的原因,其实还是有点绕的,总的来说是由于vim对编码的识别率太低了。
我服务器上默认是utf-8编码,所用的SecureCRT显示格式也设置成了utf-8编码,log文件也是用utf-8编码保存的,按理说不应该产生乱码。我用vim打开文件,用:set fileencoding命令看了下当前文件编码格式为latin1,这是一种最宽泛的编码格式。由于我系统中fileencodings=ucs-bom,utf-8,latin1 ,vim尝试去解码,最终发现latin1匹配,所以就按照latin1来解码,但log文件并不是该编码,所以产生了乱码。(顺便说下,我看网上有说latin1是最宽泛的编码方式,几乎能匹配成功任何编码)
其实我发现对于服务器上的log文件上面的所以编码它都没有匹配成功(vim打开文件发现fileencoding=空),最终用系统默认编码解码就显示正常了,如果在上面编码再加入latin1编码的话它还会显示乱码,因为latin1总是能匹配成功,这点很是无语。好像有些更强的编码匹配插件,有空可以尝试下。
总之要想不出现中文乱码,最好所有的编码都统一用utf-8编码,这种编码现在已经很广泛了。