6

utf8でエンコードされていることを確認したいファイルが必要です。

だから、私はファイルを作成します

c:\> gvim umlaute.txt

VIM で、ウムラウトを入力します。

äöü

エンコーディングをチェックします...

:set enc

(VIM エコーencoding=latin1)

次に、ファイルのエンコードを確認します...

:set fenc

(VIM エコーfileencoding=)

次に、ファイルを書き込みます

:w

ハードディスク上のファイルのサイズを確認します。

!dir umlaute.txt

(サイズは 5 バイトです) 当然のことですが、テキストに 3 バイト、\x0a \x0d に 2 バイトが必要です。

わかりましたので、エンコードを次のように設定します

:set enc=utf8

バッファ取得の奇妙な

<e4><f6><fc>

これは、以前に入力した ASCII 文字の 16進表現だと思います。

äöü

書き込み、サイズ確認:

:w
:$ dir umlaute.txt

今回は8バイトです。すべての文字に 2 バイトと \x0d \x0a を足した意味があると思います。

わかりましたので、次にファイルを開くときに、encodiung=utf8 で開かれることを確認したいと思います。

:setb
:w

:$ dir umlaute.txt

11 バイト。もちろん、これは 8 (前の) バイト + BOM (ef bb bf) の 3 バイトです。

だから私は

:quit

vim ファイルを再度開く

エンコーディングが設定されているかどうかを確認します。

:set enc

しかし、VIM はそのencoding=latin1.

それで、それはなぜですか。BOM が VIM にこれが UTF8 ファイルであることを伝えることを期待していました。

4

3 に答える 3

18

'encoding'どちらが Vim のグローバル設定で'fileencoding'、どちらが各バッファーのローカル設定であるかを混乱させています。

ファイルを開くとき、変数(最後の s'fileencodings'に注意) は、Vim がファイルを開こうとするエンコーディングを決定します。で始まる場合、正しく解析されれば、BOM を持つファイルはすべて適切に開かれます。ucs-bom

ファイルのエンコーディングを変更したい場合は、:set fenc=<foo>. BOM を削除する場合は、 を使用する必要があります:set [no]bomb。次に:w、保存に使用します。

encバッファを開いた後に変更しないでください。混乱する可能性があります。encvim が操作できる文字を決定し、操作しているファイルとは関係ありません。

詳細

c:\> gvim umlaute.txt

存在しないファイル名で vim を開いています。Vim はバッファーを作成し、その名前を付け、fenc関連付けられたファイルがないため、空の値に設定します。

:set enc

(VIM は encoding=latin1 をエコーし​​ます)

これは、Vim がバッファーの内容を ISO-8859-1 (おそらく別の番号) で保存することを意味します。

次に、ファイルのエンコードを確認します...

:set fenc

(VIM は fileencoding= をエコーし​​ます)

これは正常です。現時点ではファイルはありません。

次に、ファイルを書き込みます

:w

'fileencoding'は空なので、内部エンコーディングを使用してディスクに書き込みlatin1ます。

ハードディスク上のファイルのサイズを確認します。

!dir umlaute.txt

(サイズは 5 バイトです) 当然のことですが、テキストに 3 バイト、\x0a \x0d に 2 バイトが必要です。

わかりましたので、エンコードを次のように設定します

:set enc=utf8

違う!バッファの内容をUTF8の内容として解釈する必要があることをvimに伝えています。バッファーには、16 進数で が含まれていますe4 f6 fc 0a 0d。最初の 3 バイトは無効な UTF8 文字シーケンスです。と入力する必要があります:set fenc=utf-8。これにより、バッファが変換されます。

バッファ取得の奇妙な

Vim に不正な UTF-8 ファイルを UTF8 として解釈させると、このようなことが起こります。

これは、以前に入力した ASCII 文字の 16 進表現だと思います。

えー

書き込み、サイズ確認:

:w :$ dir umlaute.txt

今回は8バイトです。すべての文字に 2 バイトと \x0d \x0a を足した意味があると思います。

わかりましたので、次にファイルを開くときに、encodiung=utf8 で開かれることを確認したいと思います。

:set bomb :w

:$ dir umlaute.txt

11 バイト。もちろん、これは 8 (前の) バイト + BOM (ef bb bf) の 3 バイトです。

だから私は

:quit

vim ファイルを再度開く

エンコーディングが設定されているかどうかを確認します。

:set enc

しかし、VIM はその encoding=latin1 を主張します。

set fenc?ファイルの検出されたエンコーディングを知るために実行する必要があります。また、Vim で Unicode ファイルを扱えるようにしたい場合は、vimrc に'enc'utf-8 を設定する必要があります。

于 2011-08-26T12:08:53.510 に答える
3

多くの試みの後、私はここに実際の例を示します:

    setglobal bomb 
    set fileencodings=ucs-bom,utf-8,cp1251,koi8-r,cp866
    set nobin
    set fileencoding=utf-8 bomb

BOM を使用して新しいフィールドを作成する場合は、次のようにします。

    c:\gvim umlaute.txt

それは今働いています!

于 2011-12-22T06:31:52.320 に答える
1

:help bomb次の情報を明らかにします。

ファイルの書き込み時に次の条件が満たされると、BOM (バイト オーダー マーク) がファイルの先頭に追加されます。

  • このオプションはオンです (編集: ':set bomb')
  • 「バイナリ」オプションはオフです
  • 'fileencoding' は、"utf-8"、"ucs-2"、"ucs-4"、またはリトルエンディアン/ビッグ エンディアンのいずれかです。

一部のアプリケーションは、BOM を使用してファイルのエンコードを認識します。MS-Windows の UCS-2 ファイルによく使用されます。他のアプリケーションでは問題が発生します。たとえば、「cat file1 file2」と指定すると、file2 の BOM が結果ファイルの途中に表示されます。Gcc は BOM を受け入れません。Vim がファイルを読み取り、「fileencodings」が「ucs-bom」で始まる場合、BOM の存在がチェックされ、それに応じて「bomb」が設定されます。'binary' が設定されていない限り、最初の行から削除されるため、編集時に表示されません。オプションを変更しない場合、ファイルの書き込み時に BOM が復元されます。

.vimrc でこれを設定してみてください:

set fileencodings=ucs-bom,utf-8,latin1
set nobin
setglobal fileencoding=utf-8
于 2011-08-26T12:05:54.833 に答える