Vim:日本語の文字化けへの対応を攻略。もう怖くない!

最終更新:2023-02-03 by Joe

Vimの日本語文字化けへの対応方法をまとめました。vimで日本語ドキュメントを開くたびにどきどきしていた自分。文字化けするんじゃないか、解決できなくてまたまごつくんじゃないか・・。そんな臆病な自分と決別するための記事です。

Vimで日本語が文字化けした時の対応

まずは、状況の確認から。「うわー、文字化けだ!」「うわー改行コードがアレだ!」という時は、慌てず騒がず、冷静に進めましょう。

Vim で文字化けの直し方:

  1. 現在の「Vimの内部エンコーディング形式」を確認する
  2. うまく表示されるエンコーディング形式を探す
  3. ファイルを、正しいエンコーディング形式で保存する。

それでは、1つずつ見ていきましょう。

1現在の「Vim のエンコード形式」を確認する

Vimでファイルを内部的に特定のエンコーディングで認識し、画面に表示しています。これは vim のマニュアルでは「Vim 内部のエンコード方式(encoding used inside Vim)」と呼ばれていますので、ここでもそのように呼びます。

さて、Vimはファイルを開く時に、自動的にファイルがどのエンコーディングを使って保存されたかを判別してくれています。日本語のようなマルチバイト文字の文字化けが発生する時は、この自動判別が失敗したときです。

とりあえず現在の状況を確認しましょう:vim を開いてコマンドモードで下記を入力します。

# 現在の vim の内部エンコードを認するコマンド
:set encoding?

# 省略形。同じ意味です
:set enc?

下記のいずれか(または別かもしれません)のような結果が表示されるはずです:

#出力結果の例
encoding=utf-8

encoding=sjis

encoding=euc-jp

encoding=latin1

例えば、「encoding=utf-8」と表示されたのであれば、Vimとしては「utf-8でエンコードして保存されたファイルだと見なして、表示している」という事です。

「開いたファイルが最後に保存されたときのエンコード形式」と、Vimの認識(すなわち、set: encoding? の値)があわないと、日本語部分を正しくデコードできない文字が発生し、文字化けとして画面に表示される事になります。

例えば、Windows 環境のエディターで保存したファイルは、encoding の値は、sjisや、isoXXXXXX、またサーバー環境によっては、euc-jp で保存されている事があります。これらを、Linux や MacOS の環境で、VIMで開くとエンコーディングが食い違ってしまう、といったケースがほとんどの日本語文字化けの原因となるでしょう。(逆パターンも含めて)

[character=”” ]

encoding の値が「latin1」の場合

また、Vimマニュアルにも書いてありますが、もしenc?で「latin1」という値が帰ってきたら、基本的にはファイルを開く際の判別に失敗していると思って良いです。

2文字コードを指定して、ファイルを開き直す

さて、解決を試みます。

とりあえず、何らかの文字コードを直接指定してその文字コードでVIMに読み込ませることで、どの文字コードを使えばいいのか調べます。

:set enc=XXXX でいくつか試し見ます。代表的なのは:

utf-8, iso-2022-jp, euc-jp, ucs2le, ucs-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の保存に関して参考リンクです。

さすがにマニュアル詳しいですね、難しいけど。