Vim中文件編碼處理與重新打開亂碼文件詳解
前言
Vim 中有兩個與編碼有關(guān)的變量,如果理解了基本就不會再為編碼問題頭疼了。
- encoding :Vim 內(nèi)部編碼,例如 buffer、寄存器、文本等。這個值一般用戶不要設(shè)置,另外打開 Vim 之后再設(shè)置這個值也是沒有意義的。大家可以將這個值看作是 Vim 程序自己的變量,如果在工作中遇到文件的編碼問題,和 encoding 這個變量是萬萬沒有關(guān)系的。
- fileencoding :顧名思義了,就是文件的編碼。
此外還有一個值,叫 fileencodings 是個復(fù)數(shù)。一般我們將這個值在 vimrc 中設(shè)置,Vim 打開一個文件的時候回根據(jù) fileencodings 里面設(shè)置的順序來猜測文件的編碼。比如這樣設(shè)置:
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
那么有時候 Vim 猜錯了,打開的文件顯示亂碼怎么辦呢?(ps:通常 Vim 打開文件的時候亂碼是因?yàn)槟愕?fileencodings 里面沒有寫某個編碼,所以 Vim 沒有猜對。例如從上面的設(shè)置中刪掉 gb18030 ,那么打開這種編碼的文件的時候你會發(fā)現(xiàn) fileencoding 的值是 latin1 ,而文件的顯示是亂碼)
這時候你可能想到設(shè)置 fileencoding 的值,但是此時我們的文件已經(jīng)打開了,你設(shè)置后會發(fā)現(xiàn) Vim buffer 的狀態(tài)變成了 Edited 。而文件依然顯示亂碼,沒有變化。具體的原因后文會詳細(xì)解釋。
正確的做法是 以特定編碼重新打開文件 ,例如在 Vim 中使用重新打開命令 :e ++enc=gb2312 ,其中 ++enc 是一個選項(xiàng),可以指定使用的編碼。打開后你會發(fā)現(xiàn) Vim 按照你指定的形式打開了文件,但是文件變成了 readonly 狀態(tài),如果要修改,設(shè)置 :set noreadonly 就好。
其實(shí)原理有點(diǎn)像 Python 里面有人提出的 三明治模型 :
Python 在從流(例如網(wǎng)絡(luò), 文件 I/O 的時候),拿到的是 bytes ,通過 decode() 變成 str 而 Vim 在讀入一個文件的時候,根據(jù) fileencoding (用戶設(shè)置的或者通過 fileencodings 猜測,將其轉(zhuǎn)換成內(nèi)部 encoding 的編碼方式。
Python 在寫入文件的時候,用 encode() 變成 bytes 再寫。而 Vim 從 buffer 寫到文件的時候,也是將數(shù)據(jù)從內(nèi)部的 encoding 轉(zhuǎn)換成 fileencoding 再寫入。
這也就解釋了為什么亂碼的時候在 Vim 中修改 fileencoding 沒什么卵用。
因?yàn)樵诖蜷_文件之后設(shè)置 fileencoding 的值不會改變已經(jīng)載入到 Vim buffer 中的數(shù)據(jù),此時的數(shù)據(jù)已經(jīng)是轉(zhuǎn)換完成了的,這個設(shè)置只會改變寫入的時候使用目前的 fileencoding 來寫入,所以總結(jié)起來就是“打開文件使用了一個編碼,寫入文件的時候使用了另一個編碼”。
而對亂碼正確的需求應(yīng)該是:我想要以特定的編碼形式打開這個文件。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
參考:
- help :edit
- help fileencoding
- help ++enc
- VIM 文件編碼識別與亂碼處理
相關(guān)文章
linux 遠(yuǎn)程控制windows系統(tǒng)下的程序(三種方法)
這篇文章主要介紹了linux 遠(yuǎn)程控制windows下的程序,本文通過三種方法給大家詳細(xì)介紹,需要的朋友可以參考下2019-10-10Ubuntu搭建Eclipse+JDK+SDK的Android開發(fā)環(huán)境
本篇文章主要介紹了Ubuntu搭建Eclipse+JDK+SDK的Android開發(fā)環(huán)境,有興趣的同學(xué)可以了解一下。2016-11-11Ubuntu 20.04系統(tǒng)中安裝vncserver的方法步驟
這篇文章主要介紹了Ubuntu 20.04系統(tǒng)中安裝vncserver的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Ubuntu Server 10.04修改Apache的默認(rèn)目錄的方法
這篇文章主要為大家分享下Ubuntu Server 10.04修改Apache的默認(rèn)目錄的方法,需要的朋友可以參考下2013-12-12Linux下Redis允許遠(yuǎn)程連接的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Linux下Redis允許遠(yuǎn)程連接的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07