让vim在utf-8的local下打开 gbk 文件

shutFuckingup 2010-06-12

 ~/.vimrc加入

setfencs=utf-8,gbk

这一行的作用是告诉vim,打开一个文件时,尝试utf8,gbk两种编码,vim只

需要扫描文件的前一段,就可以根据文件里面的数据判断出文件是否用的是

utf8或者gbk编码。如果不指定这一行,则vim只会用当前编码(locale)

来打开文件,因为你的 locale 是 UTF-8,而文件是 gbk,所以打开是乱码。

----------------------------------------------------------------------------------------------------

一般的,vim打开中文文件时会出现乱码,原因比较复杂,不罗嗦了。直接讲解决办法

set fileencoding=gb18030set fileencodings=utf-8,gb18030,utf-16,big5

想看这样设置的原因吗?请继续。下文在网络中广泛流传

vim里面的编码主要跟三个参数有关:enc(encoding), fenc(fileencoding)和fencs(fileencodings)

其中fenc是当前文件的编码,也就是说,一个在vim里面已经正确显示了的文件(前提是你的系统环境跟你的enc设置匹配),你可以通过改变fenc后再w来将此文件存成不同的编码。比如说,我:set fenc=utf-8然后:w就把文件存成utf-8的了,:setfenc=gb18030再:w就把文件存成gb18030的了。这个值对于打开文件的时候是否能够正确地解码没有任何关系。

fencs就是用来在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。比如我的vimrc里面这个的设置是

set fileencodings=utf-8,gb18030,utf-16,big5

所以我的vim每打开一个文件,先尝试用utf-8进行解码,如果用utf-8解码到了一半出错(所谓出错的意思是某个地方无法用utf-8正确地解码),那么就从头来用gb18030重新尝试解码,如果gb18030又出错(注意gb18030并不是像utf-8似的规则编码,所以所谓的出错只是说某个编码没有对应的有意义的字,比如0),就尝试用utf-16,仍然出错就尝试用big5。这一趟下来,如果中间的某次解码从头到尾都没有出错,那么vim就认为这个文件是这个编码的,不会再进行后面的尝试了。这个时候,fenc的值就会被设为vim最后采用的编码值,可以用:setfenc?来查看具体是什么。

当然这个也是有可能出错的,比如你的文件是gb18030编码的,但是实际上只有一两个字符是中文,那么有可能他们正好也能被utf-8解码,那么这个文件就会被误认为是utf-8的导致错误解码。

至于enc,其作用基本只是显示。不管最后的文件是什么编码的,vim都会将其转换为当前系统编码来进行处理,这样才能在当前系统里面正确地显示出来,因此enc就是干这个的。在windows下面,enc默认是cp936,这也就是中文windows的默认编码,所以enc是不需要改的。在linux下,随着你的系统locale可能设为zh_CN.gb18030或者zh_CN.utf-8,你的enc要对应的设为gb18030或者utf-8(或者gbk之类的)。

最后再来说一下新建空文件的默认编码。看文档好像说会采用fencs里面的第一个编码作为新建文件的默认编码。但是这里有一个问题,就是fencs的顺序跟解码成功率有很大关系,根据我的经验utf-8在前比gb18030在前成功率要高一些,那么如果我新建文件默认想让它是gb18030编码怎么办?一个方法是每次新建文件后都:set fenc=gb18030一下,不过我发现在vimrc里面设置fenc=gb18030也能达到这个效果。

另外,在ubuntu中文论坛还有人提出了这样的办法,直接就配置了

所有代码直接粘贴到终端运行即可!

安装程序

代码:

sudo apt-get install vim-gtk vim-doc cscope

创建启动项代码:

cat > /usr/share/applications/gvim.desktop << "EOF"

[DesktopEntry]

Name=Gvim

Comment[zh_CN]=Gvim编辑器

Exec=gvim

Icon=/usr/share/pixmaps/gnome-word.png

Terminal=false

X-MultipleArgs=false

Type=Application

Categories=Application;Development;

Encoding=UTF-8

StartupNotify=true

EOF

locale为zh_CN.utf8的配置文件代码:

cat > $HOME/.vimrc << "EOF"

"===========================================================================

"项目:gvim配置文件

"作者:yonsan[QQ:82555472]

"安装:sudoapt-getinstallvim-gtk

"用法:将本文件(.vimrc)拷贝到$HOME/

"===========================================================================

" 使用 murphy 调色板

colomurphy

"设置用于GUI图形用户界面的字体列表。

setguifont=SimSun10

"

setnocompatible

"设定文件浏览器目录为当前目录

setbsdir=buffer

setautochdir

"设置编码

setenc=utf-8

"设置文件编码

setfenc=utf-8

"设置文件编码检测类型及支持格式

setfencs=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

"指定菜单语言

setlangmenu=zh_CN.UTF-8

source$VIMRUNTIME/delmenu.vim

source$VIMRUNTIME/menu.vim

"设置语法高亮度

setsyn=cpp

"显示行号

setnu!

"查找结果高亮度显示

sethlsearch

"tab宽度

settabstop=4

setcindentshiftwidth=4

setautoindentshiftwidth=4

"C/C++注释

setcomments=://

"修正自动C式样注释功能<2005/07/16>

setcomments=s1:/*,mb:*,ex0:/

"增强检索功能

settags=./tags,./../tags,./**/tags

"保存文件格式

setfileformats=unix,dos

"键盘操作

mapgk

mapgj

"命令行高度

setcmdheight=1

"使用cscope

ifhas("cscope")

setcsprg=/usr/bin/cscope

setcsto=0

setcst

setnocsverb

"addanydatabaseincurrentdirectory

iffilereadable("cscope.out")

csaddcscope.out

"elseadddatabasepointedtobyenvironment

elseif$CSCOPE_DB!=""

csadd$CSCOPE_DB

endif

setcsverb

endi

"中文帮助

ifversion>603

sethelplang=cn

endi

EOF

locale为zh_CN.gbk的配置文件代码:

cat > $HOME/.vimrc << "EOF"

"===========================================================================

"项目:gvim配置文件

"作者:yonsan[QQ:82555472]

"安装:sudoapt-getinstallvim-gtk

"用法:将本文件(.vimrc)拷贝到$HOME/

"===========================================================================

" 使用 murphy 调色板

colomurphy

"设置用于GUI图形用户界面的字体列表。

setguifont=SimSun10

"

setnocompatible

"设定文件浏览器目录为当前目录

setbsdir=buffer

setautochdir

"设置编码

setenc=chinese

"设置文件编码

setfenc=chinese

"设置文件编码检测类型及支持格式

setfencs=gbk,utf-8,ucs-bom,gb18030,gb2312,cp936

"指定菜单语言

setlangmenu=zh_CN.GBK

source$VIMRUNTIME/delmenu.vim

source$VIMRUNTIME/menu.vim

"设置语法高亮度

setsyn=cpp

"显示行号

setnu!

"查找结果高亮度显示

sethlsearch

"tab宽度

settabstop=4

setcindentshiftwidth=4

setautoindentshiftwidth=4

"C/C++注释

setcomments=://

"修正自动C式样注释功能<2005/07/16>

setcomments=s1:/*,mb:*,ex0:/

"增强检索功能

settags=./tags,./../tags,./**/tags

"保存文件格式

setfileformats=unix,dos

"键盘操作

mapgk

mapgj

"命令行高度

setcmdheight=1

"使用cscope

ifhas("cscope")

setcsprg=/usr/bin/cscope

setcsto=0

setcst

setnocsverb

"addanydatabaseincurrentdirectory

iffilereadable("cscope.out")

csaddcscope.out

"elseadddatabasepointedtobyenvironment

elseif$CSCOPE_DB!=""

csadd$CSCOPE_DB

endif

setcsverb

endi

"中文帮助

ifversion>603

sethelplang=cn

endi

EOF

不过我发现在Fedora下只要用vim就可以正常显示中文,但是vi不行

相关推荐

zycglboy / 0评论 2020-05-21