Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxについて >> LinuxのVimはutf - 8文書がどうやってやられたのか教えてくれる?

LinuxのVimはutf - 8文書がどうやってやられたのか教えてくれる?

  

Linuxのシステム運用証明書では、Vimはテキストエディタですが、実際にはutf-8文書が文字化けして表示されます。次の小シリーズでは、UTF-8文書が文字化けするVimの表示の問題を解決する方法を説明します。見てみましょう。

1.基本的な知識の導入

のVimでは、符号化に関連する4つのオプションがあり、それらは:fileencodings、ファイル・エンコーディング、エンコーディングおよびtermencoding。実際の使用では、いずれかのオプションによって文字化けが発生します。したがって、すべてのVimユーザーはこれら4つのオプションの意味についてはっきりしているはずです。以下では、これら4つの選択肢の意味と役割について詳しく説明します。

(1)encoding

encodingはVimの内部で使われている文字エンコーディング方法です。エンコーディングを設定すると、Vim内のすべてのバッファ、レジスタ、スクリプト内の文字列などはすべてこのエンコーディングを使用します。 Vimが動作しているとき、エンコーディングがその内部エンコーディングと矛盾していると、まずエンコーディングを内部エンコーディングに変換します。作業コードに内部エンコードに変換できない文字が含まれていると、これらの文字は失われます。したがって、Vimの内部エンコーディングを選ぶときは、通常の動作に影響を与えないように十分な性能のコードを使うようにしてください。

encodingオプションはVimの全文字の内部表現を参照するので、Vimが起動したときに一度だけ設定できます。 Vimの作業中にエンコードを変更すると、多くの問題を引き起こす可能性があります。ユーザーマニュアルでは、.vimrcでのみ値を変更することが推奨されています。特別な理由がない場合は、常にencodingをutf-8に設定してください。 WindowsなどのUTF-8以外のシステムでメニューやシステムプロンプトが文字化けするのを防ぐために、これらの設定を同時に行うことができます。

set encoding = utf-8

set langmenu = zh_CN .UTF-8

言語メッセージzh_CN.UTF-8

(2)termencoding

termencodingはVimが画面を表示するのに使うコードです。内部コードを画面コードに変換して、それを出力に使用します。内部コードにスクリーンコードに変換できない文字が含まれている場合、その文字は疑問符になりますが、その編集操作には影響しません。 termencodingが設定されていない場合は、変換せずに直接encodingを使用してください。

たとえば、Windowsでtelnetを使ってLinuxワークステーションにログインすると、WindowsのtelnetはGBKでエンコードされていて、LinuxはUTF-8エンコーディングを使っているので、telnetの下のVimでは文字化けします。 。この時点で、文字化けを解消するには2つの方法があります。1つはVimのエンコーディングをgbkに変更すること、もう1つはutf-8としてエンコーディングを維持すること、gmekに変換することです。明らかに、前者の方法を使用するとき、これらの文字が編集されたファイルの中でGBKで表すことができない文字に遭遇するとそれらの文字は失われるでしょう。ただし、後者の方法を使用すると、端末の制限によりこれらの文字を表示することはできませんが、編集処理中にこれらの文字が失われることはありません。

グラフィカルインターフェース下のGVimでは、その表示はTERMに依存しないので、termencodingはそれに意味がありません。 GTK2の下のGVimでは、termencodingは常にutf-8であり、変更することはできません。 Windows環境下のGVimは、ターエンコーディングの存在を無視しています。

(3)fileencoding

Vimがディスクからファイルを読み込むとき、ファイルのエンコーディングを検出します。ファイルがVimの内部エンコーディングとは異なる方法でエンコードされている場合、Vimはエンコーディングを変換します。変換が完了すると、Vimはfileencodingオプションをファイルのエンコーディングに設定します。 Vimがディスクを保存するときに、エンコーディングとファイルエンコーディングが異なると、Vimはエンコーディング変換を行います。したがって、ファイルを開いた後でfileencodingを設定することで、ファイルをあるエンコードから別のエンコードに変換できます。しかし、前の紹介文からわかるように、ファイルを開くときにfileencodingは自動的にVimによって設定されます。したがって、文字化けした場合、ファイルを開いた後でファイルエンコードをリセットしても文字化けを修正できません。

一言で言えば、fileencodingはVimで現在編集中のファイルの文字エンコーディングであり、ファイルを保存するときにはファイルをこの文字エンコーディングとして保存します(新しいファイルであるかどうかにかかわらず)。

(4)fileencodings

コードの自動認識は、fileencodingsを設定することで達成されます。複数形に注意してください。 Fileencodingsはコンマ区切りのリストで、リスト内の各項目はエンコードされた名前です。ファイルを開くとき、VIMはfileencodingsのエンコーディングを使用してデコードし、成功した場合はエンコードを使用してfileencodingをこの値に設定し、失敗した場合は次のエンコードをテストします。

したがって、ファイルエンコードを設定するときは、ファイルがこのコードではない場合はより厳密なコーディング方法を使用し、緩やかなコーディング方法を使用する必要があります。たとえば、latin1は非常に緩やかなエンコード方式で、エンコードによって取得されたテキストはlatin1でデコードされ、デコードが失敗することはありません。もちろん、デコードの結果は当然のことと見なされます。 - 'したがって、latin1をfileencodingsの最初の場所に入れると、文字化けしている中国語ファイルを開くのは当然のことです。

以下は、オンラインで推奨されるファイルエンコード設定です。

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

なかでも、ucs-bomは非常に厳密なエンコーディングであり、エンコードされたファイルをucs-bomと誤認することはほとんど不可能であるため、最初に配置されます。

utf-8も、非常に短いファイルを除いて、非常に厳密です(たとえば、多くの人が「Unicom」でコード化されたGBKをUTF-8エンコーディングの古典的なエラーと誤って判断します)。一般ファイルは誤解される可能性がほとんどないため、2番目に配置されます。

次はcp936とgb18030ですが、この2つのコードは比較的ゆるいので、前に置いた場合は誤解が多くなる可能性があるので、遅らせるようにしてください。 cp936のエンコードスペースはgb18030よりも小さいので、cp936をgb18030の前に置きます。

big5、euc-jp、euc-krに関しては、cp936と厳密さが似ていますので、これらをエンコードしたファイルを編集するときには、誤解が多くなりますが、これはVimに組み込まれています。コード検出メカニズムが解決できるものは何もありません。中国のユーザーはこれらのエンコードされたファイルを編集する機会がめったにないので、これらのコードの識別を確実にするためにcp936とgb18030を前に置くことにしました。

最後はlatin1です。それは非常にゆるいコードです、それで我々はそれを最後の場所に置かなければなりません。しかし、残念なことに、本当のlatin1エンコーディングのファイルに遭遇したとき、ほとんどの場合、latin1にフォールバックする機会はありません。これは、前のエンコーディングでは誤って判断されることがよくあります。ただし、前述のように、中国のユーザーはそのような文書にあまりアクセスできません。

コードが誤って判断された場合、デコードされた結果は人間に認識されないため、ファイルが文字化けしていると言えます。この時点で、このファイルの正しいエンコーディングがわかっている場合は、ファイルを開くときに++ enc = encodingを使用してファイルを開くことができます。たとえば、次のようになります。

:e ++ enc = utf-8 myfile。 Txt

上記はVim display utf-8ドキュメントの文字化け方法に対するLinuxのソリューションです。文字化けした問題の後、ファイルエンコーディングを再設定することで解決できます。

Copyright © Windowsの知識 All Rights Reserved