专栏首页蓝天Vim编码知识,乱码问题

Vim编码知识,乱码问题

原文:http://demi-panda.com/2012/12/26/vim-encoding/

在vim的初始学习阶段,乱码经常是困扰新手的一个比较烦躁的问题,本文试图阐述Vim的编码知识,及设置,针对乱码的原因和解决方案。

文本编码

  常见的文本编码包括:ASCII、GBK、GB2312、GB18030、UTF8、UTF16等,各种编码的来源与详细知识请参考以下的这篇文档:http://hi.baidu.com/sinper9527/blog/item/4b6a58020b06c481d43f7c81.html

Vim编码选项

Encoding- 简写Enc

  encoding 是 Vim 内部使用的字符编码方式。当我们设置了 encoding 之后,Vim 内部所有的 buffer、寄存器、脚本中的字符串等,全都使用这个编码。

  由于 encoding 选项涉及到 Vim 中所有字符的内部表示,因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改 encoding 会造成非常多的问题。Linux操作系统默认编码都是UTF-8,如果没有特殊情况,最好设置encoding为UTF-8。为了避免在非 UTF-8 的系统如 Windows 下,菜单和系统提示出现乱码,可同时做这几项设置:

$ vim ~/.vimrc #添加如下设置 set encoding=utf-8 set langmenu=zh_CN.UTF-8 language message zh_CN.UTF-8

termencoding

  故明思意termencoding 是 Vim 用于屏幕显示的编码,在显示的时候,Vim 会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果 termencoding 没有设置,则直接使用 encoding 不进行转换。

fileencoding

  当 Vim 从磁盘上读取文件的时候,会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同,Vim 就会对编码进行转换。转换完毕后,Vim 会将 fileencoding 选项设置为文件的编码。当 Vim 存盘的时候,如果 encoding 和 fileencoding 不一样,Vim 就会进行编码转换。因此,通过打开文件后设置 fileencoding,我们可以将文件由一种编码转换为另一种编码。

fileencodings

  编码的自动识别是通过设置 fileencodings 实现的,注意是复数形式。fileencodings 是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件的时候,VIM 按顺序使用 fileencodings 中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将 fileencoding 设置为这个值,如果失败的话,就继续试验下一个编码。

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

注意

latin1 是一种非常宽松的编码方式,如果你把 latin1 放到了 fileencodings 的第一位的话,打开任何中文文件都是乱码也就是理所当然的了。

Vim编码转换流程图

借用网友的一张流程图

乱码的原因分析

1、操作系统的语言环境, 使用 locale 查看 2、Vim的enc 设置,enc是用于VIM做内部表示的,也就是说VIM内部处理的是以enc编码的文本流,所以实际上enc的值和显示是否乱码没有根本上的必要联系。只不过enc的值通常是tenc的取值来源而已,所以这里暂且将它列举为可能引起乱码的一个因素。  3、Vim的tenc 设置

解决方案

1、从上面的原因来分析,tenc是用于告诉VIM终端的locale值是什么的,那么,如果tenc告诉VIM的值是错误的话,那就肯定乱码。所以乱码的最根本原因就是tenc的值和locale的值不同而造成的。 (1) 在Native Linux/Unix环境下,locale的值与tenc的值不同  (2) 在Windows环境下,终端软件设置的Encoding(可以认为是locale)的值与tenc的值不同 

2、遵循简单而统一的原则 (1) 中文环境GBK码  将你的locale设置为zh_CN.gbk,然后将VIM设置如下:

set enc=gbk set fencs=gbk,gb2312,gb18030,cp936,utf8 

(2) 中文环境utf8码  将你的locale设置为zh_CN.utf8,然后将VIM设置如下:

set enc=utf8 set fencs=utf8,gbk,gb2312,gb18030,cp936 

(3) 英文环境ASCII码 最简单的就这个了,啥都不用设置了,建议还是用英文环境最好...

3、可以设置系统变量

$ vi ~/.bash_profile 或者 vi /etc/profile #添加如下代码 export LANG="zh_CN.UTF-8" 或者"en_US.UTF-8" export LC_ALL="zh_CN.UTF-8" 或者"en_US.UTF-8"

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 类的层次结构设计

    在写程序时,我们会经常遇到如上图所示的一种情形——深层调用,ClassD1和ClassD2需要调用ClassA关联的ClassX、ClassY和ClassZ等,...

    一见
  • 代码中创建新终端

    最常见于使用SecureCRT等工具远程创建打开终端,下面的代码演示在代码中创建打开终端:

    一见
  • 安装thrift时,注意openssl参数

    在安装基于openssl-1.0.1c的thrift-0.9.0时,正常使用--with-openssl在configure时会出错,报“Error: libc...

    一见
  • C++核心准则C.44:默认构造函数最好简单而且不会抛出异常

    C.44: Prefer default constructors to be simple and non-throwing

    面向对象思考
  • LintCode 买卖股票的最佳时机题目分析代码

    假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。

    desperate633
  • 近期工作与学习技术总结

    逍遥剑客
  • 大数据颠覆新闻生产方式

    大数据文摘
  • 在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决过程

    需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度。想的很美好,于是快速撸了类似下面的...

    HOHO
  • 搭建一个泰拉瑞亚手机版服务器

    于是mobile端找了我好久终于在 https://forums.terraria.org/index.php?threads/terraria-mobile-...

    iVampireSP.com
  • web前端与手机应用的这些重点和知识点,你知道多少呢

    随着互联网、移动互联网的发展,HTML5成为了客户端软件开发的主流技术,HTML5实际上是由:HTML5语言、CSS3、JAVASCRIPT语言组成。

    用户5827212

扫码关注云+社区

领取腾讯云代金券