2022-06-04

VimでShift_JISなファイルを文字化けせずに開くために文字エンコーディングの設定を見直した

Microsoft Excelで作成されたCSVファイルをvimで開いたら文字化けしてしまう状態だったので、これを機にVimの文字エンコーディングまわりの設定を見直しました。

設定見直し前の状態

文字コードShift_JISで保存されたファイルを開くと次の画像のような状態になっていました。

文字化けしている様子
文字化けしている様子

:e ++enc=sjis で開き直す

この事象への対処方法として一番最初に知ったのはコマンドモードで :e ++enc=sjis として自ら明示的に文字コードを設定して開き直す方法です。これを実行すると次のように期待通りにファイルが読み込まれます。

期待通りに開かれた様子
期待通りに開かれた様子

:e:edit の略で、引数としてファイルパスを指定していないのでカレントファイルを開き直すことになります。

そして :e にオプションを渡すときは ++{optname}={value} という形式で指定するようになっており、enc というのは encoding の略です。つまり ++encoding=sjis としているのと同じです。

encodingfileencodings

一旦の目的としてはこの対処方法だけ覚えておけば良さそうですが、コマンドを1ヶ月後には忘れそうな気がします。また、このやり方は開こうとしているファイルの文字コードを予め特定できていないといけないですね。

もう少し楽をできないものかとVimのドキュメントを見たり、関連しそうなネット上の記事を読んでいたところ、fileencodings という設定値を見つけました。

https://vim-jp.org/vimdoc-ja/options.html#'fileencodings'

ドキュメントによると次のような説明があります。

既存のファイルの編集を開始するときに考慮される文字エンコーディングのリストである。 ファイルが読み込まれると、Vimは指定されたうちの先頭の文字エンコーディングを使おうとする。そのときエラーが発見されると、値のリスト内で次に並んでいるエンコーディングが試される。

つまり、次のような設定にすれば、まずUTF-8で読み込もうとし、失敗した場合にShift_JISで読み込むようにできます。

set fileencodings=utf-8,sjis

もし、UTF-8とShift_JISの両方に失敗した場合、encoding に設定した値が使われるとドキュメントに書かれています。ということで、encoding には大抵の変換がうまくいく utf-8 を指定しておくのが無難と思われます。

set encoding=utf-8
set fileencodings=utf-8,sjis

今回の設定追加を行う前は encodingfileencodings もどちらも未指定でした。文字化け画像のキャプチャの右下を見てもわかるのですが、文字コードは latin1 として認識されています。これはどうやら、encoding 未指定時のデフォルト値が私の環境では latin1 になっていたからのようです。

なお、この記事中では fileencodings として utf-8sjis の2つしか指定していませんが、ご自身が扱うファイルの種類に応じて設定を追加しておく必要があることはご注意ください。
具体的に指定できる値については encoding-names に一覧化されています。

参考