Vimで開いているファイルの文字コードを確認する方法
画面に文字化けが出たとき、今のファイルがどの文字コードとして認識されているかをまず確認したくなります。毎回コマンドを打つのが面倒なら、ステータスラインに常時表示させておく方法もあります。
その場で確認する
:set enc?
encodingの末尾に?を付けて実行すると、現在の値が画面下部に表示されます。ただしこれはVim内部で使っているencodingの値であって、ファイルの保存に使われるfileencodingとは別の値です。ファイルが今どの文字コードとして扱われているかを知りたい場合は、こちらも合わせて確認すると確実です。
:set fenc?
| コマンド | 確認できること |
|---|---|
:set enc? | Vim内部で使う文字コード(encoding) |
:set fenc? | ファイルの保存に使う文字コード(fileencoding) |
:set ff? | 改行コード(fileformat) |
ステータスラインに常時表示する
set statusline=%{&fenc!=''?&fenc:&enc}/%{&ff}
この設定を入れておくと、fileencodingが設定されていればその値を、空であればencodingの値をステータスラインに表示します。末尾の%{&ff}は改行コード(fileformat)も一緒に表示する指定で、文字コードと改行コードは同時に確認したくなることが多いのでセットにしておくと便利です。
ステータスラインには他にも表示したい情報が色々あるはずなので、実際にはファイル名や行番号などと組み合わせてvimrcやinit.luaに設定しておくのが一般的です。laststatusの設定と合わせて調整すると使いやすくなります。表示条件については別記事で扱っています。
lightline/lualineなどのプラグインを使っている場合
ステータスラインをプラグインで管理している場合は、statuslineを直接書き換えるのではなく、そのプラグイン側の設定項目で文字コードの表示を有効にする形になります。多くのステータスラインプラグインには文字コード・改行コード表示用のコンポーネントが標準で用意されているので、まずはプラグインのドキュメントで対応する項目を探すほうが早いことが多いです。
:set enc?/:set fenc?で十分です。頻繁に文字コードの違うファイルを扱うなら、ステータスラインに常時表示させておくと切り替えのたびに気づきやすくなります。
複数のレガシーシステムのログファイルを行き来する作業で、ファイルごとに文字コードがバラバラだったため、ステータスラインに表示する設定を入れてから文字化けに気づくのが早くなりました。都度:set enc?を打っていた頃は、気づかず編集を進めてから文字化けに驚くことがよくありました。常時表示にしてからは、開いた瞬間に違和感のある表示に気づけるようになったのが一番大きい変化でした。
改行コードも一緒に確認する
文字化けだと思っていた不具合が、実は改行コード(fileformat)の不一致だった、ということもあります。:set ff?で確認でき、unix・dos・macの3種類が主な値になります。文字コードとあわせてこちらも確認しておくと、原因の切り分けが早くなります。
まとめ
文字コードの確認は:set enc?/:set fenc?で即座にでき、頻繁に確認するならステータスラインに常時表示しておくのが実用的です。保存時の文字コード変更は別記事で扱っています。