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
としているのと同じです。
encoding
と fileencodings
一旦の目的としてはこの対処方法だけ覚えておけば良さそうですが、コマンドを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
今回の設定追加を行う前は encoding
も fileencodings
もどちらも未指定でした。文字化け画像のキャプチャの右下を見てもわかるのですが、文字コードは latin1
として認識されています。これはどうやら、encoding
未指定時のデフォルト値が私の環境では latin1
になっていたからのようです。
なお、この記事中では fileencodings
として utf-8
と sjis
の2つしか指定していませんが、ご自身が扱うファイルの種類に応じて設定を追加しておく必要があることはご注意ください。
具体的に指定できる値については encoding-names に一覧化されています。