Vimの日本語文字化けへの対応方法をまとめました。vimで日本語ドキュメントを開くたびにどきどきしていた自分。文字化けするんじゃないか、解決できなくてまたまごつくんじゃないか・・。そんな臆病な自分と決別するための記事です。
目次
vimで文字化けした時の対応
現在のvimの内部文字コードを認識します。「うわー、文字化けだ!」「うわー改行コードがアレだ!」という時は、慌てず騒がず、冷静に進めましょう。
vimの文字化けした時の対応:
- 現在のVimの内部文字コードを確認する
- 文字コードを指定して、ファイルを開き直す
- ファイルを、お好みの文字コードで保存し直す
それでは、1つずつ見ていきます。
1現在のVim 文字コードを確認する
Vimでファイルを開いて、現在の文字コードを確認します。Vimはファイルを開く時に、自動的に文字コードを判別してくれます。それでも文字化けする時は、この自動判別が失敗したときです。
とりあえず現在の状況を確認しましょう。
# ファイルの文字コード確認 :set enc? # 出力結果 encoding=utf-8
上記のような出力の場合、Vimとしては「utf-8で記述されたファイルだと見なして、読み込んで表示している」という事です。実際のエンコードと、Vimの認識があわないとうまく表示されず、文字化けする事になります。
例えば、windowsの人が保存したファイルは、sjisや、isoxxx、またサーバー環境によっては、euc-jpで保存されていたりしたときに、LinuxやMacの環境で開くと食い違う、といったケースもも多いでしょう。(最近はそこまで多くもないかもしれません)
encoding の値が「latin1」の場合
また、Vimマニュアルにも書いてありますが、もしenc?で「latin1」という値が帰ってきたら、基本的にはファイルを開く際の判別に失敗していると思って良いです。
2文字コードを指定して、ファイルを開き直す
さて、解決を試みます。実際のファイル側の文字コードは、だれが最後にファイルを保存したかで、おおよそ察しがつくと思います。それがわかってもわからなくても、とりあえず、何らかの文字コードを直接指定して、ファイルを開き直してみましょう。
ファイルを開き直すには「:e」を実行します。また「++」に続けて、実行コマンドを付与できます。いつくか思いつく文字コードを、えいっえいっと試してみて下さい。「sjis」「euc-jp」「utf-8」などとやれば、だいたいうまくいくと思います。
# ファイルを開き直す(euc-jpで開き直す場合) :e ++enc=euc-jp # あれっ、うまく行かたなかった・・、sjisも試してみる :e ++enc=sjis
たぶんうまくいかない・・:Macのexcelの問題
マックからExcelで出力したCSVの判別がいろいろ複雑な事になっているようで、「文字コードは何か?」に対して、正しい答えがわかりません。筆者もこれはVim上で解決できませんでした。
現状わかっている解決手段は、いったんエクセルから
ツールバー > インポート > CSV
とすすみ、文字コードを「Japanese (Mac)」で一旦開けますので、別の文字コードで保存するために、そこからクリップボードを経由して、Google Spreadsheetなどから、再度CSVを吐き出す、などでしょうか・・・。
3文字コードを指定して、保存する
さて、上記、SJISでうまくファイルが文字化けせず開けたとします。Vimでは、ファイルを開いた際に、自動的に「保存処理を実行した時のエンコード設定(fileencoding値)」がその値に登録されます。これはファイルエンコーディングを、不用意に元のファイルの状態から変更しないためのVim仕様だと思います。
でも、どうせまたVimで開くので、今後のことも考えて「uft-8」に変換して(かつ、別ファイル名で)保存しておきます。
# 保存エンコーディングを明示的にセット(utf-8で保存する) :set fenc=utf-8 # ファイルを別名で、保存。そのままそのファイルを編集 :saveas index-utf8.html # もし、saveasの代わりに:もし上書きしていいなら、そのまま上書き :w
これで、文字化けしないファイルの完成です。解決できましたね?
追加対応:vim設定ファイルに対応を書き込む
さて、上位で行った事を頻繁に行わなかればいけないとき、毎回対応するのは大変なので、デフォルトの設定を、~/.vimrcに書いておきます。
上記では言及しなかったのですが、Vimの設定値に「fileencodings」(最後の「s」に注意)「fileformats」という値があります。「fileencodings」は、Vim起動時の文字コードの自動判別で、設定値の左から順番に試して「成功」と判別されたら、その文字コードで開きます。判別に成功したその時点で、自動的にそのfileencoding, fileformat値が、それぞれ、fileencodingやfileformatに(一時的に)設定されます。
ですので、.vimrcに対して、下記のように、よくある化け種類の正解コードを左側に書いておくと、先に判別され、そのコードで開いて貰える確率が上がると思います。
どう設定しておくべき?というのは、自分の状況や、チームの状況によるとおもいますので、必要に応じてカスタマイズして使って下さい。
################################## # Vim起動時に、判別の優先度を定める設定 ################################## # ファイルを読み込む時の、文字コード自動判別の順番 :set fileencodings=utf-8,cp932,euc-jp,sjis ################################## # Vim起動時に、強制する設定 ################################## # vimの内部文字コード (これを書くと、上記の優先度設定が無視されます) :set encoding=utf-8 # ファイルのエンコーディング(改行コードの種類) :set fileformat=unix
もちろん、vim 起動中も「:set fencs?」「:set ff?」などを実行すれば、現在の設定を確認できますからね。
参考リンク
日本語っていろいろ大変ですね。でも、上記を把握しておくと、結構文字コードが怖くないです。類似の話題で、改行コードに関してはこっちも参考にどうぞ。
Vimの保存に関して参考リンクです。
さすがにマニュアル詳しいですね、難しいけど。