|
|

楼主 |
发表于 2008-8-1 21:07:44
|
显示全部楼层
Post by richardpku;1881313
没有观察到这种现象。我的VIM总是保存成UTF-8没有问题……
我觉得更可能的是你第一组测试里汉字加得太少,被file误判了。ISO-8859根本不支持编码汉字……
我刚才查了一下维基百科里关于ISO-8859的资料,ISO-8859是在ASCII的基础上定义的一个扩展字符集,加入了西方其它一些语言的字母符号。所以应该是VI可能用了某种双字节编码保存文件,但是没有被file等程序正确识别,所以把双字节当作单字节拆分开来显示了。
于是我做了下面这个测试(觉得长的话也可以跳过我测试的过程直接看我得出的结论,其实结论很简单,因为做这个测试之前没想到,所以试探过程麻烦了点):
- clinif@localhost ~ $ vi test (内容是abcdefg)
- clinif@localhost ~ $ file test
- test: ASCII text
- clinif@localhost ~ $ hexdump test (0x0a是换行符)
- 0000000 6261 6463 6665 0a67
- 0000008
- clinif@localhost ~ $ vi test (在原内容后添加"只是一个测试")
- clinif@localhost ~ $ file test
- test: ISO-8859 text
- clinif@localhost ~ $ hexdump test
- 0000000 6261 6463 6665 d667 cabb d2c7 b8bb b2f6
- 0000010 cae2 0ad4
- 0000014
- clinif@localhost ~ $ cat test (根据ISO-8859-1的编码表查询知道,后面的“乱码”部分基本符合上面多出的十六进制值)
- abcdefgֻÊÇһ¸ö²âÊÔ
- clinif@localhost ~ $ vi test2 (内容是“abcdefg只是一个测试”)
- clinif@localhost ~ $ file test2
- test2: UTF-8 Unicode text
- clinif@localhost ~ $ hexdump test2 (这才是UTF-8的编码内容)
- 0000000 6261 6463 6665 e567 aa8f 98e6 e4af 80b8
- 0000010 b8e4 e6aa 8bb5 afe8 0a95
- 000001a
- clinif@localhost ~ $ cat test2
- abcdefg只是一个测试
- clinif@localhost ~ $
复制代码
当用VI打开那个所谓的ISO-8859的test文件的时候,输入命令“:set fenc=gb2312”没有任何变化,而如果输入“:set fenc=utf-8”,则提示文件已经改变。可见VIM是以GB2312编码保存的,为了确认这一猜想,我用vi新建了test3,内容与test文件相同,但是在保存的时候就使用了“:set fenc=gb2312”,结果hexdump出来的结果与test完全相同。可见我的VI确实是默认以GB2312保存文件的,基本上证明了我的猜测,有地方的配置文件覆盖了~/.vimrc里的设置。
附上我找到的/etc/vim/vimrc文件的内容(别处是否还有VI的配置我暂时不清楚),请熟悉VI配置文件的朋友帮忙看看,是不是GENTOO自带的这个配置覆盖了我的fenc设定?还是VIM是先读取了~/.vimrc然后又读取/etc下的配置?
呵呵,不好意思,这个文件默认就是这么长,我没改过,麻烦大家了!
- scriptencoding utf-8
- " ^^ Please leave the above line at the start of the file.
- " Default configuration file for Vim
- " $Header: /var/cvsroot/gentoo-x86/app-editors/vim-core/files/vimrc-r3,v 1.1 2006/03/25 20:26:27 genstef Exp $
- " Written by Aron Griffis <agriffis@gentoo.org>
- " Modified by Ryan Phillips <rphillips@gentoo.org>
- " Modified some more by Ciaran McCreesh <ciaranm@gentoo.org>
- " Added Redhat's vimrc info by Seemant Kulleen <seemant@gentoo.org>
- " You can override any of these settings on a global basis via the
- " "/etc/vim/vimrc.local" file, and on a per-user basis via "~/.vimrc". You may
- " need to create these.
- " {{{ General settings
- " The following are some sensible defaults for Vim for most users.
- " We attempt to change as little as possible from Vim's defaults,
- " deviating only where it makes sense
- set nocompatible " Use Vim defaults (much better!)
- set bs=2 " Allow backspacing over everything in insert mode
- set ai " Always set auto-indenting on
- set history=50 " keep 50 lines of command history
- set ruler " Show the cursor position all the time
- set viminfo='20,"500 " Keep a .viminfo file.
- " Don't use Ex mode, use Q for formatting
- map Q gq
- " When doing tab completion, give the following files lower priority. You may
- " wish to set 'wildignore' to completely ignore files, and 'wildmenu' to enable
- " enhanced tab completion. These can be done in the user vimrc file.
- set suffixes+=.info,.aux,.log,.dvi,.bbl,.out,.o,.lo
- " When displaying line numbers, don't use an annoyingly wide number column. This
- " doesn't enable line numbers -- :set number will do that. The value given is a
- " minimum width to use for the number column, not a fixed size.
- if v:version >= 700
- set numberwidth=3
- endif
- " }}}
- " {{{ Modeline settings
- " We don't allow modelines by default. See bug #14088 and bug #73715.
- " If you're not concerned about these, you can enable them on a per-user
- " basis by adding "set modeline" to your ~/.vimrc file.
- set nomodeline
- " }}}
- " {{{ Locale settings
- " Try to come up with some nice sane GUI fonts. Also try to set a sensible
- " value for fileencodings based upon locale. These can all be overridden in
- " the user vimrc file.
- if v:lang =~? "^ko"
- set fileencodings=euc-kr
- set guifontset=-*-*-medium-r-normal--16-*-*-*-*-*-*-*
- elseif v:lang =~? "^ja_JP"
- set fileencodings=euc-jp
- set guifontset=-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*
- elseif v:lang =~? "^zh_TW"
- set fileencodings=big5
- set guifontset=-sony-fixed-medium-r-normal--16-150-75-75-c-80-iso8859-1,-taipei-fixed-medium-r-normal--16-150-75-75-c-160-big5-0
- elseif v:lang =~? "^zh_CN"
- set fileencodings=gb2312
- set guifontset=*-r-*
- endif
- " If we have a BOM, always honour that rather than trying to guess.
- if &fileencodings !~? "ucs-bom"
- set fileencodings^=ucs-bom
- endif
- " Always check for UTF-8 when trying to determine encodings.
- if &fileencodings !~? "utf-8"
- set fileencodings+=utf-8
- endif
- " Make sure we have a sane fallback for encoding detection
- set fileencodings+=default
- " }}}
- " {{{ Syntax highlighting settings
- " Switch syntax highlighting on, when the terminal has colors
- " Also switch on highlighting the last used search pattern.
- if &t_Co > 2 || has("gui_running")
- syntax on
- set hlsearch
- endif
- " }}}
- " {{{ Terminal fixes
- if &term ==? "xterm"
- set t_Sb=^[4%dm
- set t_Sf=^[3%dm
- set ttymouse=xterm2
- endif
- if &term ==? "gnome" && has("eval")
- " Set useful keys that vim doesn't discover via termcap but are in the
- " builtin xterm termcap. See bug #122562. We use exec to avoid having to
- " include raw escapes in the file.
- exec "set <C-Left>=\eO5D"
- exec "set <C-Right>=\eO5C"
- endif
- " }}}
- " {{{ Filetype plugin settings
- " Enable plugin-provided filetype settings, but only if the ftplugin
- " directory exists (which it won't on livecds, for example).
- if isdirectory(expand("$VIMRUNTIME/ftplugin"))
- filetype plugin on
- " Uncomment the next line (or copy to your ~/.vimrc) for plugin-provided
- " indent settings. Some people don't like these, so we won't turn them on by
- " default.
- " filetype indent on
- endif
- " }}}
- " {{{ Fix &shell, see bug #101665.
- if "" == &shell
- if executable("/bin/bash")
- set shell=/bin/bash
- elseif executable("/bin/sh")
- set shell=/bin/sh
- endif
- endif
- "}}}
- " {{{ Our default /bin/sh is bash, not ksh, so syntax highlighting for .sh
- " files should default to bash. See :help sh-syntax and bug #101819.
- if has("eval")
- let is_bash=1
- endif
- " }}}
- " {{{ Autocommands
- if has("autocmd")
- augroup gentoo
- au!
- " Gentoo-specific settings for ebuilds. These are the federally-mandated
- " required tab settings. See the following for more information:
- " http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml
- " Note that the rules below are very minimal and don't cover everything.
- " Better to emerge app-vim/gentoo-syntax, which provides full syntax,
- " filetype and indent settings for all things Gentoo.
- au BufRead,BufNewFile *.e{build,class} let is_bash=1|setfiletype sh
- au BufRead,BufNewFile *.e{build,class} set ts=4 sw=4 noexpandtab
- " In text files, limit the width of text to 78 characters, but be careful
- " that we don't override the user's setting.
- autocmd BufNewFile,BufRead *.txt
- \ if &tw == 0 && ! exists("g:leave_my_textwidth_alone") |
- \ setlocal textwidth=78 |
- \ endif
- " When editing a file, always jump to the last cursor position
- autocmd BufReadPost *
- \ if ! exists("g:leave_my_cursor_position_alone") |
- \ if line("'"") > 0 && line ("'"") <= line("$") |
- \ exe "normal g'"" |
- \ endif |
- \ endif
- " When editing a crontab file, set backupcopy to yes rather than auto. See
- " :help crontab and bug #53437.
- autocmd FileType crontab set backupcopy=yes
- augroup END
- endif " has("autocmd")
- " }}}
- " {{{ vimrc.local
- if filereadable("/etc/vim/vimrc.local")
- source /etc/vim/vimrc.local
- endif
- " }}}
- " vim: set fenc=utf-8 tw=80 sw=2 sts=2 et foldmethod=marker :
复制代码 |
|