vim工具解析文件时使用的编码方式不对
(2)源文件vim打开没有乱码,但是终端显示乱码
终端编码方式不对,导致输出为乱码
解决方法:
(1)在vim中可以查看文件的编码方式,:set fileencoding
如果显示编码方式为latin1,那是因为vim解析文件时没有设置解析的先后顺序,直接默认用latin1解析,造成乱码
vim ~/.vimrc
在里面加入一下设置:
set encoding=utf-8 (vim内部使用的编码)
set termencoding=utf-8 (vim把内部编码的内容输出到终端的编码,简称终端编码)
set fileencoding=utf-8 (文件编码,即文件内容以fileencoding编码保存到硬盘上)
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1(文件编码探测列表)
set termencoding=utf-8
如果encoding和termencoding设置不同,vi会尝试把encoding编码的内容转换为termencoding编码后输入到终端
所以如果确保可以正确的显示内容,我们需要保证termencoding编码表现能力强于或者等于encoding编码的表现力,建议二者设置相同。如果没有设置termencoding,则默认termencoding=encoding;如果有些字符不能正确从内部编码转换到终端编码,则会显示问号,但是可以完成对内容编辑。
set fileencoding=utf-8
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中的内容自然也是乱码;最后显示到终端的内容自然也肯定是乱码了。
set encoding=utf-8
vim工作时候,所有的buffer、寄存器和脚本字符串等都使用这个编码;如果文件内容编码和encoding不同, vi会把文件转码然后把内容存入buffer中;如果encoding的编码不足够强的话,可能出现信息丢失情况。例如文件编码为utf-8切包含了gbk无法表示的字符,encoding设置为gbk,此时将无法正确完成转码,无法转换的部分将出现数据丢失情况。因此我们建议encoding一定要设置一个表现力足够强的编码,一般设置为utf-8编码。
:set fileencoding=utf-8
这样终端输出就对了