Chinaunix首页 | 论坛 | 博客
  • 博客访问: 297920
  • 博文数量: 240
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-04 18:14
文章分类

全部博文(240)

文章存档

2017年(8)

2014年(4)

2013年(15)

2012年(4)

2011年(14)

2010年(55)

2009年(140)

我的朋友

分类: LINUX

2013-08-12 17:34:49

Vim 有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding(这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们的意义如下:
(1)encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在 .vimrc 中改变它的值才有意义。 与系统当前locale相同,所以编辑文件的时候要考虑当前locale,否则要设置的东西就比较多了。
(2)fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
(3)fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
(4)ermencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。




Vim 的多字符编码方式支持是这样工作的:
(1)Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。
(2)读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的,看起来是正确的 (注1) 字符编码方式,其实际有可能是不正确的。
(3)对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为 encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的 iconv.dll (注2),你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。
(4)编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用 iconv.dll


说明:
由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议 encoding 的值设置为 utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 ;) 。
我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese(chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示 cp936,也就是 GBK 的代码页)。 


 




解决乱码举例:
1. 一个文件,在windows下用gvim打开正常,在linux 用vim打开乱码。
观察:windows 下,查看. encoding(cp936), fileencoding(cp936), termencoding()
      linux   下, 查看  encoding(utf-8), fileencoding(latin1),termencoding()
      (查看方式    :set encoding  |  :set fileencoding  |  :set termencoding)
分析:是fileencoding 检查出错所致, 但是查看 fileencodings 设置, gvim(windows) 和 vim(linux) 都是 set fileencodings=utf-8,utf-16,cp936,cs-bom,latin-1 可见在 linux 下并没有真正检测出文件编码类型为 cp936(虽然它在前面), 而误认为latin-1


解决办法:
    1.指定以cp936格式重新加载文件。 :edit ++enc=cp936
      注意,不是se fileencodings=cp936, 那只是把文件保存为cp936
    2. 搞定vim 文件编码判定过程, 例如在首行添加一个中文。例如: //中文, 就能正确识别。推荐此法
    3. 临时修改locale, 以达到修改encoding 的目的。




更好的办法:
编辑~/.vimrc文件:


set fileencodings=gb2312,gb18030,utf-8
set termencoding=utf-8
set encoding=prc 


或:
set encoding=utf-8 
set termencoding=utf-8 
set fileencoding=utf-8 
set fileencodings=ucs-bom,utf-8,chinese,cp936 























阅读(699) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~