注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

linux 下vi乱码问题总结  

来自yfkscu@126   2013-06-25 19:23:45|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  在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中的内容自然也是乱码;最后显示到终端的内容自然也肯定是乱码了。
  评论这张
 
阅读(857)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017