Vimで文字コードを変更して保存する(fileencoding/fenc)
Shift-JISで書かれたファイルをUTF-8で保存し直したいだけなのに、どのオプションをいじればいいのか毎回忘れます。保存時の文字コードを決めるのはfileencoding(短縮形fenc)オプションです。
| コマンド | これだけ覚える |
|---|---|
:set fileencoding=utf-8 / :set fenc=utf-8 | 保存時の文字コードを指定 |
:w | 指定した文字コードで実際に保存(これを忘れると反映されない) |
:set fileencoding? | 現在の設定を確認 |
保存する文字コードを指定する
:set fileencoding=utf-8
:w
短縮形を使えばこう書けます。
:set fenc=utf-8
:w
よく使う指定はこのあたりになります。
| 文字コード | 指定例 |
|---|---|
| UTF-8 | fenc=utf-8 |
| Shift-JIS | fenc=shift-jis |
| EUC-JP | fenc=euc-jp |
| Windows(CP932) | fenc=cp932 |
指定しただけでは保存されない
ここが引っかかりやすい点です。:set fenc=を実行した時点では、バッファ内のエンコーディング指定が変わるだけで、ディスク上のファイルはまだ書き換わっていません。必ず続けて:wを実行して初めてファイルに反映されます。エンコーディングを変えたのに保存を忘れて閉じてしまい、変更が消えたと勘違いすることがあるので注意が必要です。
文字コードごとに保存を分けたいとき
同じディレクトリ内に複数の文字コードのファイルが混在するプロジェクトでは、ファイルタイプやディレクトリごとに保存時の文字コードを自動で切り替えたくなることがあります。autocmdと組み合わせれば、特定の拡張子やパスパターンに応じてfileencodingをあらかじめ設定しておけます。
autocmd BufReadPost *.csv setlocal fenc=cp932
毎回手動で:set fenc=を打つより、こうしたルールを決めておくほうがミスを減らせます。
fileencodingとencodingの違い
名前が似ていますが、指しているものが違います。
fileencoding | encoding | |
|---|---|---|
| 対象 | そのバッファを保存するときの文字コード | Vim内部でテキストを処理する文字コード |
| 変更の影響範囲 | そのファイルの保存形式だけ | 表示・内部処理全体 |
| 通常の運用 | ファイルごとに調整する | utf-8で固定しておく |
encodingを変更すると表示や内部処理全体に影響するため、通常はutf-8のまま固定しておき、ファイルごとの保存形式だけをfileencodingで調整するのが安全な運用になります。現在の設定を確認する方法は別記事で扱っています。
fencで指定し、必ず:wまでセットで実行します。内部処理用のencodingとは役割が違うので混同しないよう注意してください。
古いシステムの設定ファイルがShift-JISで、UTF-8のまま保存して文字化けさせてしまったことがあります。それ以来、既存ファイルを編集する前に必ず現在の文字コードを確認する癖がつきました。fencで変換した直後に:wを忘れて「反映されない」と焦ったことも一度や二度ではありません。
まとめ
fileencoding(fenc)は保存時の文字コードを制御するオプションで、変更後は必ず保存操作とセットで使います。読み込み時の文字コードを変えたい場合は別の方法が必要になります。