linuxでvimにファイル符号化を自動的に認識させる方法と関連属性の説明


一、vim自動認識符号化


結論先行して、filencodings属性は私たちの符号化自動認識の鍵であり、私たちは自分のvimrc中のfilencodings属性を修正することによって、永久自動認識符号化の機能を達成することができる.
[root@Dev ~/dev]$ cat ~/.vimrc
[root@Dev ~/dev]$ vim ~/.vimrc
[root@Dev ~/dev]$ cat ~/.vimrc
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

さらに、他の補助符号化の設定もあります.
# vi 
set nocompatible
# backspace 
set backspace=2
# tab 4 
set ts=4
set expandtab
# 
set autoindent
# 
set number

以下vimと符号化に関する属性の説明(転載先http://edyfox.codecarver.org/html/vim_fileencodings_detection.html)で、これらの属性説明により、上記設定の意味がわかります.

二、vim符号化属性説明


Vimには、filencoding、filencoding、encoding、termencodingの4つのエンコードに関するオプションがあります.実際の使用では、いずれかのオプションにエラーが発生すると、文字化けしてしまいます.したがって、各Vimユーザーは、この4つのオプションの意味を明確にする必要があります.以下では、この4つのオプションの意味と役割について詳しく説明します.

1.1 encoding


encodingは、Vim内部で使用される文字符号化方式である.encodingを設定すると、Vim内部のすべてのbuffer、レジスタ、スクリプトの文字列など、この符号化が使用されます.Vimが動作する場合、符号化方式が内部符号化と一致しない場合は、まず符号化を内部符号化に変換します.作業用の符号化に内部符号化に変換できない文字が含まれていると、これらの文字は失われます.そのため、Vimの内部符号化を選択する際には、正常な動作に影響を与えないように、表現能力が十分強い符号化を使用しなければならない.
encodingオプションは、Vim内のすべての文字の内部表示に関連するため、Vim起動時に一度しか設定できません.Vim作業中にencodingを変更すると、非常に多くの問題が発生します.特に理由がない場合は、常にencodingをutf-8に設定してください.WindowsなどのUTF-8以外のシステムでは、メニューとシステムのプロンプトが文字化けして表示されないように、これらの設定を同時に行うことができます.
set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8

1.2 termencoding


termencodingはVimが画面表示用の符号化であり、表示時にはVimが内部符号化を画面符号化に変換して出力に用いる.イントラエンコーディングにスクリーンエンコーディングに変換できない文字が含まれている場合、その文字は疑問符になりますが、その編集操作には影響しません.termencodingが設定されていない場合は、encodingを直接使用して変換しません.
例えば、Windowsの下でtelnetを介してLinuxワークステーションにログインすると、WindowsのtelnetはGBK符号化されているため、Linuxの下でUTF-8符号化を使用すると、telnetの下のVimで符号化が乱れます.この場合、2つの文字化けし方があります.1つは、Vimのencodingをgbkに変更することです.もう1つは、encodingをutf-8に維持し、termencodingをgbkに変更し、Vimが表示されたときに符号化を変更することです.明らかに、前の方法では、編集したファイルにGBKでは表現できない文字が含まれている場合、これらの文字は失われます.ただし、後者の方法を使用すると、端末が限られているため、これらの文字は表示できませんが、編集中にこれらの文字は失われません.
グラフィックインタフェースのGVimではTERMに依存しないためtermencodingは意味がない.GTK 2でのGVimではtermencodingは常にutf-8であり、変更はできません.Windowsの下のGVimはtermencodingの存在を無視します.

1.3 fileencoding


Vimがディスクからファイルを読み込むと、ファイルのエンコードが検出されます.ファイルの符号化方式がVimの内部符号化方式と異なる場合、Vimは符号化を変換する.変換が完了すると、Vimはfilencodingオプションをファイルのエンコードに設定します.Vimメモリの場合、encodingとfilencodingが異なると、Vimは符号化変換を行います.したがって、ファイルを開いてfilencodingを設定することで、ファイルを1つの符号化から別の符号化に変換することができます.
ただし、前述の説明から分かるように、filencodingはファイルを開くときに、Vimによってプローブされて自動的に設定されている.したがって、文字化けしが発生した場合、ファイルを開いた後にfilencodingを再設定することで文字化けしを修正することはできません.

1.4 fileencodings


符号化の自動認識はfilencodingsを設定することによって実現され,複素形式であることに注意する.filencodingsはカンマで区切られたリストで、リストの各項目は符号化された名前です.ファイルを開くと、VIMはfilencodingsの符号化を順に用いて復号を試み、成功すればこの符号化方式で復号を行い、filencodingをこの値に設定し、失敗すれば次の符号化の試験を継続する.
したがって、filencodingsを設定する際には、ファイルがこの符号化でない場合に復号失敗しやすい符号化方式を前にし、ゆとりのある符号化方式を後ろに置く必要があります.
例えば、latin 1は非常にゆとりのある符号化方式であり、いずれの符号化方式で得られたテキストも、latin 1で復号化されても復号失敗は起こらない--もちろん、復号化の結果は当然の「乱符号化」である.だから、latin 1をfilencodingsの1位に置いたら、どんな中国語のファイルを開いても文字化けして当たり前です.
以下は雲南狐が推奨するfilencodingsの設定です.
set fileencodings=ucs-bom,utf-8,cp 936,gb 18030,big 5,euc-jp,euc-kr,latin 1ではucs-bomは非常に厳格な符号化であり、この符号化されていないファイルはucs-bomと誤認される可能性はほとんどないため、1位に置かれる.
utf-8もかなり厳格で、短いファイルのほか(例えば多くの人が興味津々にしているGBK符号化の「連通」がUTF-8符号化の古典的なエラーと誤審されている)、現実生活では一般的なファイルはほとんど誤審されないため、2位にランクインした.
次はcp 936とgb 18030で、この2つの符号化は比較的緩やかで、前に置くと大量の誤審が発生するので、後ろに寄らせます.cp 936の符号化空間はgb 18030より小さいので、cp 936をgb 18030の前に置く.
big 5、euc-jp、euc-krについては、それらの厳格さとcp 936の差は多くなく、それらを後ろに置いて、これらの符号化されたファイルを編集する際に必然的に大量の誤審が発生するが、これはVim内蔵符号化検出メカニズムでは解決できないことである.中国のユーザーはこれらの符号化されたファイルを編集する機会が少ないため、cp 936とgb 18030を前提にこれらの符号化の識別を保証することにした.
最後はlatin 1です.それは極めて緩やかなコードで、私たちはそれを最後に置かなければなりません.しかし、残念なことに、本当にlatin 1が符号化されたファイルに出会ったとき、ほとんどの場合、fall-backからlatin 1に行く機会がなく、前の符号化で誤審されることが多い.しかし、前述したように、中国のユーザーはこのようなファイルに触れる機会があまりありません.