溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Vim中文件編碼處理與重新打開(kāi)亂碼文件的示例分析

發(fā)布時(shí)間:2021-07-21 10:19:00 來(lái)源:億速云 閱讀:180 作者:小新 欄目:服務(wù)器

這篇文章主要介紹了Vim中文件編碼處理與重新打開(kāi)亂碼文件的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

Vim 中有兩個(gè)與編碼有關(guān)的變量,如果理解了基本就不會(huì)再為編碼問(wèn)題頭疼了。

  • encoding  :Vim 內(nèi)部編碼,例如 buffer、寄存器、文本等。這個(gè)值一般用戶不要設(shè)置,另外打開(kāi) Vim 之后再設(shè)置這個(gè)值也是沒(méi)有意義的。大家可以將這個(gè)值看作是 Vim 程序自己的變量,如果在工作中遇到文件的編碼問(wèn)題,和 encoding  這個(gè)變量是萬(wàn)萬(wàn)沒(méi)有關(guān)系的。

  • fileencoding  :顧名思義了,就是文件的編碼。

此外還有一個(gè)值,叫 fileencodings 是個(gè)復(fù)數(shù)。一般我們將這個(gè)值在 vimrc 中設(shè)置,Vim 打開(kāi)一個(gè)文件的時(shí)候回根據(jù) fileencodings 里面設(shè)置的順序來(lái)猜測(cè)文件的編碼。比如這樣設(shè)置:

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

那么有時(shí)候 Vim 猜錯(cuò)了,打開(kāi)的文件顯示亂碼怎么辦呢?(ps:通常 Vim 打開(kāi)文件的時(shí)候亂碼是因?yàn)槟愕?fileencodings 里面沒(méi)有寫某個(gè)編碼,所以 Vim 沒(méi)有猜對(duì)。例如從上面的設(shè)置中刪掉 gb18030 ,那么打開(kāi)這種編碼的文件的時(shí)候你會(huì)發(fā)現(xiàn) fileencoding 的值是 latin1 ,而文件的顯示是亂碼)

這時(shí)候你可能想到設(shè)置 fileencoding 的值,但是此時(shí)我們的文件已經(jīng)打開(kāi)了,你設(shè)置后會(huì)發(fā)現(xiàn) Vim buffer 的狀態(tài)變成了 Edited 。而文件依然顯示亂碼,沒(méi)有變化。具體的原因后文會(huì)詳細(xì)解釋。

正確的做法是 以特定編碼重新打開(kāi)文件 ,例如在 Vim 中使用重新打開(kāi)命令 :e ++enc=gb2312 ,其中 ++enc 是一個(gè)選項(xiàng),可以指定使用的編碼。打開(kāi)后你會(huì)發(fā)現(xiàn) Vim 按照你指定的形式打開(kāi)了文件,但是文件變成了 readonly 狀態(tài),如果要修改,設(shè)置 :set noreadonly 就好。

其實(shí)原理有點(diǎn)像 Python 里面有人提出的 三明治模型 :

Vim中文件編碼處理與重新打開(kāi)亂碼文件的示例分析

Python 在從流(例如網(wǎng)絡(luò), 文件 I/O 的時(shí)候),拿到的是 bytes ,通過(guò) decode() 變成 str 而 Vim 在讀入一個(gè)文件的時(shí)候,根據(jù) fileencoding (用戶設(shè)置的或者通過(guò) fileencodings 猜測(cè),將其轉(zhuǎn)換成內(nèi)部  encoding 的編碼方式。

Python 在寫入文件的時(shí)候,用 encode() 變成 bytes 再寫。而 Vim 從 buffer 寫到文件的時(shí)候,也是將數(shù)據(jù)從內(nèi)部的 encoding 轉(zhuǎn)換成 fileencoding 再寫入。

這也就解釋了為什么亂碼的時(shí)候在 Vim 中修改 fileencoding 沒(méi)什么卵用。

因?yàn)樵诖蜷_(kāi)文件之后設(shè)置 fileencoding 的值不會(huì)改變已經(jīng)載入到 Vim buffer 中的數(shù)據(jù),此時(shí)的數(shù)據(jù)已經(jīng)是轉(zhuǎn)換完成了的,這個(gè)設(shè)置只會(huì)改變寫入的時(shí)候使用目前的 fileencoding 來(lái)寫入,所以總結(jié)起來(lái)就是“打開(kāi)文件使用了一個(gè)編碼,寫入文件的時(shí)候使用了另一個(gè)編碼”。

而對(duì)亂碼正確的需求應(yīng)該是:我想要以特定的編碼形式打開(kāi)這個(gè)文件。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Vim中文件編碼處理與重新打開(kāi)亂碼文件的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

vim
AI