vim字元編碼與顯示

來源:互聯網
上載者:User

轉自:http://blog.chinaunix.net/u1/37553/showart_347927.html

 

     和所有的流行文字編輯器一樣,Vim 可以很好的編輯各種字元編碼的檔案,這當然包括
UCS-2、UTF-8 等流行的 Unicode 編碼方式。然而不幸的是,和很多來自 Linux 世界的軟
件一樣,這需要你自己動手設定。

Vim 有四個跟字元編碼方式有關的選項,encoding、fileencoding、fileencodings、
termencoding (這些選項可能的取值請參考 Vim 線上協助 :help encoding-names),它們
的意義如下:

    * encoding: Vim 內部使用的字元編碼方式,包括 Vim 的 buffer (緩衝區)、菜單文
本、訊息文本等。預設是根據你的locale選擇.使用者手冊上建議只在 .vimrc 中改變它的值,事實上似乎也只有在.vimrc 中改變它的值才有意義。你可以用另外一種編碼來編輯和儲存檔案,如你的vim的encoding為utf-8,所編輯的檔案採用cp936編碼,vim會自動將讀入的檔案轉成utf-8(vim的能讀懂的方式),而當你寫入檔案時,又會自動轉回成cp936(檔案的儲存編碼).

    * fileencoding: Vim 中當前編輯的檔案的字元編碼方式,Vim 儲存檔案時也會將檔案
儲存為這種字元編碼方式 (不管是否新檔案都如此)。
    * fileencodings: Vim自動探測fileencoding的順序列表, 啟動時會按照它所列出的字元編碼方式逐一探測即將開啟的檔案的字元編碼方式,並且將 fileencoding 設定為最終探測到的字元編碼方式。因此最好將Unicode 編碼方式放到這個列表的最前面,將拉丁語系編碼方式 latin1 放到最後面。
    * termencoding: Vim 所工作的終端 (或者 Windows 的 Console 視窗) 的字元編碼方
式。如果vim所在的term與vim編碼相同,則無需設定。如其不然,你可以用vim的termencoding選項將自動轉換成term的編碼.這個選項在 Windows 下對我們常用的 GUI 模式的 gVim 無效,而對 Console 模式的Vim 而言就是 Windows 控制台的字碼頁,並且通常我們不需要改變它。

好了,解釋完了這一堆容易讓新手犯糊塗的參數,我們來看看 Vim 的多字元編碼方式支援
是如何工作的。

   1. Vim 啟動,根據 .vimrc 中設定的 encoding 的值來設定 buffer、菜單文本、訊息
文的字元編碼方式。
   2. 讀取需要編輯的檔案,根據 fileencodings 中列出的字元編碼方式逐一探測該檔案
編碼方式。並設定 fileencoding 為探測到的,看起來是正確的 (注1) 字元編碼方式。
   3. 對比 fileencoding 和 encoding 的值,若不同則調用 iconv 將檔案內容轉換為
encoding 所描述的字元編碼方式,並且把轉換後的內容放到為此檔案開闢的 buffer 裡,
此時我們就可以開始編輯這個檔案了。注意,完成這一步動作需要調用外部的 iconv.dll
(注2),你需要保證這個檔案存在於 $VIMRUNTIME 或者其他列在 PATH 環境變數中的目錄裡

   4. 編輯完成後儲存檔案時,再次對比 fileencoding 和 encoding 的值。若不同,再次
調用 iconv 將即將儲存的 buffer 中的文本轉換為 fileencoding 所描述的字元編碼方式
,並儲存到指定的檔案中。同樣,這需要調用 iconv.dll

   由於 Unicode 能夠包含幾乎所有的語言的字元,而且 Unicode 的 UTF-8 編碼方式又是
非常具有性價比的編碼方式 (空間消耗比 UCS-2 小),因此建議 encoding 的值設定為
utf-8。這麼做的另一個理由是 encoding 設定為 utf-8 時,Vim 自動探測檔案的編碼方式
會更準確 (或許這個理由才是主要的 ;)。我們在中文 Windows 裡編輯的檔案,為了兼顧與
其他軟體的相容性,檔案編碼還是設定為 GB2312/GBK 比較合適,因此 fileencoding 建議
設定為 chinese (chinese 是個別名,在 Unix 裡表示 gb2312,在 Windows 裡表示
cp936,也就是 GBK 的字碼頁)。

以下是我的 .vimrc(見附件) 中關於字元編碼方式設定的內容,這個設定比較有彈性,可以
根據系統中的環境變數 $LANG (當然,Windows 中的寫法是 %LANG%) 的值來自動化佈建合適
的字元編碼方式。此時,推薦設定 %LANG% = zh_CN.UTF-8,可以通過後面的 Windows 註冊
表指令檔來方便的做到。

注1: 事實上,Vim 的探測準確度並不高,尤其是在 encoding 沒有設定為 utf-8 時。因此
強烈建議將 encoding 設定為 utf-8,雖然如果你想 Vim 顯示中文菜單和提示訊息的話這
樣會帶來另一個小問題。

注2: 在 GNU 的 FTP 上可以下載到 iconv 的 Win32 版
(http://mirrors.kernel.org/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip),不推薦去
GnuWin32(http://gnuwin32.sourceforge.net/) 下載 libiconv,因為那個版本舊一些,並
且需要自己改名 dll 檔案。

注3: 查看協助 :h iconv-dynamic
  On MS-Windows Vim can be compiled with the |+iconv/dyn| feature.  This means
Vim will search for the "iconv.dll" and "libiconv.dll" libraries.  When
neither of them can be found Vim will still work but some conversions won't be
possible.

--

附1:vimrc檔案

    " Multi-encoding setting, MUST BE IN THE BEGINNING OF .vimrc!
    "
    if has("multi_byte")
      " When 'fileencodings' starts with 'ucs-bom', don't do this manually
      "set bomb
      set fileencodings=ucs-bom,chinese,taiwan,japan,korea,utf-8,latin1
      " CJK environment detection and corresponding setting
      if v:lang =~ "^zh_CN"
        " Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
        set encoding=chinese
        set termencoding=chinese
        if &fileencoding == ''
          set fileencoding=chinese
        endif
      elseif v:lang =~ "^zh_TW"
        " Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
        set encoding=taiwan
        set termencoding=taiwan
        if &fileencoding == ''
          set fileencoding=taiwan
        endif
      elseif v:lang =~ "^ja_JP"
        " Japanese, on Unix euc-jp, on MS-Windows cp932
        set encoding=japan
        set termencoding=japan
        if &fileencoding == ''
          set fileencoding=japan
        endif
      elseif v:lang =~ "^ko"
        " Korean on Unix euc-kr, on MS-Windows cp949
        set encoding=korea
        set termencoding=korea
        if &fileencoding == ''
          set fileencoding=korea
        endif
      endif
       " Detect UTF-8 locale, and override CJK setting if needed
      if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
        set encoding=utf-8
      endif
    else
      echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'
    endif

附2:
Supported 'encoding' values are:                        *encoding-values*
1   latin1      8-bit characters (ISO 8859-1)
1   iso-8859-n  ISO_8859 variant (n = 2 to 15)
1   koi8-r      Russian
1   koi8-u      Ukrainian
1   macroman    MacRoman (Macintosh encoding)
1   8bit-{name} any 8-bit encoding (Vim specific name)
1   cp437       similar to iso-8859-1
1   cp737       similar to iso-8859-7
1   cp775       Baltic
1   cp850       similar to iso-8859-4
1   cp852       similar to iso-8859-1
1   cp855       similar to iso-8859-2
1   cp857       similar to iso-8859-5
1   cp860       similar to iso-8859-9
1   cp861       similar to iso-8859-1
1   cp862       similar to iso-8859-1
1   cp863       similar to iso-8859-8
1   cp865       similar to iso-8859-1
1   cp866       similar to iso-8859-5
1   cp869       similar to iso-8859-7
1   cp874       Thai
1   cp1250      Czech, Polish, etc.
1   cp1251      Cyrillic
1   cp1253      Greek
1   cp1254      Turkish
1   cp1255      Hebrew
1   cp1256      Arabic
1   cp1257      Baltic
1   cp1258      Vietnamese
1   cp{number}  MS-Windows: any installed single-byte codepage
2   cp932       Japanese (Windows only)
2   euc-jp      Japanese (Unix only)
2   sjis        Japanese (Unix only)
2   cp949       Korean (Unix and Windows)
2   euc-kr      Korean (Unix only)
2   cp936       simplified Chinese (Windows only)
2   euc-cn      simplified Chinese (Unix only)
2   cp950       traditional Chinese (on Unix alias for big5)
2   big5        traditional Chinese (on Windows alias for cp950)
2   euc-tw      traditional Chinese (Unix only)
2   2byte-{name} Unix: any double-byte encoding (Vim specific name)
2   cp{number}  MS-Windows: any installed double-byte codepage
u   utf-8       32 bit UTF-8 encoded Unicode (ISO/IEC 10646-1)
u   ucs-2       16 bit UCS-2 encoded Unicode (ISO/IEC 10646-1)
u   ucs-2le     like ucs-2, little endian
u   utf-16      ucs-2 extended with double-words for more characters
u   utf-16le    like utf-16, little endian
u   ucs-4       32 bit UCS-4 encoded Unicode (ISO/IEC 10646-1)
u   ucs-4le     like ucs-4, little endian

  The {name} can be any encoding name that your system supports.  It is passed
to iconv() to convert between the encoding of the file and the current locale.
For MS-Windows "cp{number}" means using codepage {number}.

  Several aliases can be used, they are translated to one of the names above.
An incomplete list:

1   ansi        same as latin1 (obsolete, for backward compatibility)
2   japan       Japanese: on Unix "euc-jp", on MS-Windows cp932
2   korea       Korean: on Unix "euc-kr", on MS-Windows cp949
2   prc         simplified Chinese: on Unix "euc-cn", on MS-Windows cp936
2   chinese     same as "prc"
2   taiwan      traditional Chinese: on Unix "euc-tw", on MS-Windows cp950
u   utf8        same as utf-8
u   unicode     same as ucs-2
u   ucs2be      same as ucs-2 (big endian)
u   ucs-2be     same as ucs-2 (big endian)
u   ucs-4be     same as ucs-4 (big endian)
    default     stands for the default value of 'encoding', depends on the
                environment

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.