Vim 字符编码设置与解决中文显示乱码问题

By | 最新修改:2024-08-17

前言

本文探讨一下 Ubuntu 操作系统下 Vim 编辑器的编码设置和中文乱码问题。

编辑器 Vim 一直是文本编辑器界中的翘楚,多年以来,只有另一个王者 Emacs 在名声上能与之抗衡。丰富的插件、基于 VimScript 和 ELisp 脚本编程语言的高度定制化等等优势特性吸引了众多的代码编写人员和 Linux 维护人员所青睐。

在使用过程中,多么神的编辑器都会避免不了文本编码乱码的问题,Vim 也不例外,解决这个问题这也正是本文编写的主要目的。


Vim 常用的文本编码设置选项

set encoding:设置编辑器内部编码

set encoding 选项设置 Vim 内部使用的字符编码。

默认值:Windows 缺省值是“utf-8”,其它系统是 $LANG 值(这是个全局的变量,可通过 echo $LANG 命令查看其值)或者“latin1”。

它应用于缓冲区、寄存器、表达式所用的字符串、viminfo 保存的等等文本,也就是设置 Vim 的工作字符类型。

在 GTK+ 2 或更新版本建议将其设为 utf-8

set encoding=utf-8

它简称 set enc,上面的选项也可写成:

set enc=utf-8

set termencoding:设置终端使用的编码

set termencoding:设置用于终端的编码。此选项指定键盘产生以及终端显示能识别的字符编码。在图形用户界面它仅应用于键盘,而 encoding 用于显示。

默认值:””,GTK+ GUI 使用“utf-8”。

GUI 一旦成功初始化完毕,则 termencoding 将被强制设置为“utf-8”。此时如何设置为其他值,那么将被 Vim 拒绝,并且会显示错误消息。

set termencoding=utf-8

set fileencoding:设置缓冲区的字符编码

set fileencoding:为当前缓冲区的文件设置字符编码。

默认值为:””。

fileencodingencoding 相异时,编码转换(转换到 fileencoding 的值)完成于从缓冲区写入文件。

如果 fileencoding 保持默认值,那么它使用与 encoding 相同的值,然而读写文件时不需要转换编码。

encodingfileencoding 都是 Unicode 编码,同时 fileencoding 不是“utf-8”,编码转换会成功完成。因为, Unicode 在 Vim 内部总是作为“utf-8”编码存储。

注意:

此时,转换编码将会导致信息的丢失,从而产生乱码。

encoding 值为“utf-8”或者其他 Unicode 编码时,通过反向转换的方式使得编码转换可能取得成功而得到相同的文本。

encoding 不是”utf-8“时,会出现信息丢失的情况,从而导致乱码。

当正在读一个文件的时候,fileencoding 将会设置为 fileencodings 中的值(上面提到,写文件时用的是 fileencoding设置的编码);当 fileencodings 的值列表是空的时候,fileencoding 的值将会应用。

set fileencoding=utf-8

set fileencodings:一个字符编码列表

set fileencodings:当开始打开文件并编辑时所考虑的一个字符编码列表。

默认值:”ucs-bom”,当设定 encoding 为一个 Unicode 系的值时,fileencodings 默认值为“ucs-bom,utf-8,default,latin1”。

当读取文件时,Vim 首先取得 fileencodings 字符列表中的第一个编码,如果该编码出现错误,那么就应用下一个编码,依此类推。若遇到可用的编码,则它将被设为 fileencoding 的值。如果全部都失败,那么 fileencoding 的值将设为空值“”””;这时使用的是 encoding 设置的编码。

注意:

此时,编码转换可能会导致信息的丢失!

encoding 设置为“utf-8”或者其他 Unicode 变种编码时,通过反向转换取得可能取得相同的转换文本。

encoding 不是“utf-8”,一些非“ASCII”字符可能会丢失,从而出现乱码。

对于空文件或者文件中仅有“ASCII”字符的情况,大多数编码能正常工作,并且 fileencodings 列表中的第一个编码将会被使用(除了“usc-bom”)。

set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
; 或者
set fileencodings=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936

scriptencoding:VimScript 脚本使用的编码

scriptencoding:指定 VimScript 脚本中使用的字符编码。

scriptencoding utf-8
; 或者
scripte utf-8

关于 Vim 字符编码的设置总结

; 系统全局配置
; 这是 Vim 最优先寻找的配置文件,不同系统略有不同
sudo bash -c 'cat >> /etc/vim/vimrc <<EOF
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
scriptencoding=utf-8
EOF'

; 用户配置
bash -c 'cat >> ${HOME}/.vimrc <<EOF
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
scriptencoding=utf-8
EOF'

; 定义的 Vim 配置
; 默认情况下,Vim 在 ~ 的目录下寻找 .vimrc 文件,
; 若是找不到,则下一个地方是 ~/.vim/vimrc,实验证明,该路径也是可以的
bash -c 'cat >> ${HOME}/.vim/vimrc <<EOF
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
scriptencoding=utf-8
EOF'

; 或者其他在 vimrc 文件导入的 VimScript 文件中也是可以的
bash -c 'cat >> /path/to/other/vim-encoding-setting-file <<EOF
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
scriptencoding=utf-8
EOF'

总结

本文通过 Vim 关于编码设置的示例,顺带解决 Vim 的中文乱码问题,一般情况下,只要各个编码选项设为“utf-8”,基本上可解决中文乱码问题。

此外,还可以在 Vim 的编辑器界面临时设置字符编码,比如设置 fileencoding的值,可以在编辑器的“常规(Normal)”模式中,执行 :set fileencoding=utf-8 来对当前缓冲区应用“utf-8”编码(假设当前 Vim 的配置文件中设置的并非“utf-8”),当写入文件时,缓冲区中的文件文本会被设置为“utf-8”编码。



程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com