Vim编码知识,乱码问题

简介: 原文:http://demi-panda.com/2012/12/26/vim-encoding/ 在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"
相关文章
|
机器学习/深度学习 开发工具 Ubuntu
|
4月前
|
Unix Linux 开发工具
Linux Vim的 命令大全
Linux Vim的 命令大全
56 0
|
5月前
|
存储 Linux Shell
常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件
这篇文章介绍了Vim编辑器的基本使用、常用命令和模式,以及Linux系统中用户和组的管理方法,包括用户和组相关文件如/etc/passwd、/etc/shadow和/etc/group的说明。
常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件
|
5月前
|
存储 Linux 编译器
linux中vim介绍以及常用命令大全
linux中vim介绍以及常用命令大全
111 8
|
6月前
|
Unix Linux 开发工具
在Linux中,有哪些基本的 Vim 命令?
在Linux中,有哪些基本的 Vim 命令?
|
7月前
|
Ubuntu Unix Linux
Linux Vim最全面的教程
Linux Vim最全面的教程
|
7月前
|
Linux Shell 开发工具
Linux Vim批量注释和自定义注释
在Vim中,快速批量注释和取消Shell脚本的多行可以使用替换命令。例如,用`:1,10s/^/#/g`在第1到10行行首加`#`注释,`:1,10s/^#//g`则移除这些行的行首`#`。定义快捷键如`:map^P l#<Esc>`(需用Ctrl+V+P生成^P)能一键在当前行添加`#`注释。要取消注释,可以定义`:map^B 0x`来删除行首字符。通过`.vimrc`保存快捷键设置,可使它们在每次启动Vim时生效。
|
7月前
|
搜索推荐 Linux 开发工具
|
7月前
|
Linux 开发工具 数据安全/隐私保护
【linux】如何优雅的使用vim编辑器
【linux】如何优雅的使用vim编辑器
|
7月前
|
Ubuntu Linux 开发工具
Linux Vim最全面的教程
Linux Vim最全面的教程
454 0