Vim – 文字コードを自動認識して判定/判別する方法

midSun31midSun31
IT・デジタル

Vimエディタは必ず何らかの文字コードでファイルを開きますが、そのロジックはなかなか複雑です。適切に設定しておかないと思わぬところで文字化けします。

この記事では、Vimエディタでファイルの文字コードを自動認識して判定・判別する方法についてご紹介していきます。Vimエディタのバージョンは8.1を利用しています。

自動判定/判別の設定

Vimで文字コードを自動判定して文字化けを防ぐには、次のfileencodingsの設定がおすすめです。

set encoding=utf-8
set fileencodings=iso-2022-jp,ucs-bom,sjis,utf-8,euc-jp,cp932,default,latin1

上記のコマンドをvimrcファイルに追記します。

以後は、上記の設定を推奨する理由をVimの文字コードの認識の仕組みと共に解説します。

文字コードに関連する設定項目

Vimの文字コードの認識において、キーとなる項目は以下の3点です。

  • fileencoding
    Vimエディタでファイルを保存する時の文字コードの設定です。

    Vimエディタ上で次のコマンドで設定することができます。

    :set fenc=文字コード

    詳しい手順は『Vim – 文字コードの確認と変更/変換して保存する方法』を参考にしてください。
  • fileencodings
    Vimエディタでファイルを読み込む時の文字コードの設定です。複数の文字コードを設定することができます。

    vimrcファイルで以下の例のように設定できます。

    set fileencodings=文字コード1,文字コード2…
  • encoding
    Vimエディタの内部文字コードです。

    vimrcファイルで以下のように設定できます。

    set encoding=文字コード

Vimの文字コード認識の流れ

Vimエディタでは次のロジックで文字コードを自動認識するようになっています。

  1. fileencodings」に記載されている文字コードを左から順に試し、次の基準のいずれかに当てはまるようであれば当該文字コードで開きます。
    • 文字化けせずに開ける文字コードである
    • ファイルの「fileencoding」の値に一致する文字コードである
    • Vimエディタの「encoding」の値に一致する文字コードである
  2. いずれの条件にも一致しない場合は、Vimエディタの「encoding」に設定されている文字コードで開きます。

上記の流れのとおり、主にfileencodingsの設定によってファイルの文字コードが自動判別されます。

自動認識の具体例

Vimの文字コードの自動認識について、fileencoding、fileencodings、encodingの設定を変更して検証してみましょう。

検証1: いずれにも一致しない

fileencoding、fileencodings、encodingが以下のような設定値になっている場合です。

#ファイル
fileencoding=
 
#vimrc
set encoding=cp932
set fileencodings=ucs-bom

上記のケースでファイルを開くと、fileencodingsの文字コードでは開けないため、encodingの「cp932」の文字コードで開かれます。

検証2: fileencodingが対象ファイルのfileencodingsに一致

fileencoding、fileencodings、encodingが以下のような設定値になっている場合です。

#ファイル
fileencoding=utf-8
 
#vimrc
set encoding=cp932
set fileencodings=ucs-bom,utf-8,cp932

上記のケースでファイルを開くと、fileencodingsで一致した文字コード「utf-8」で開かれます。

検証3: fileencodingsのいずれかに(ファイルの文字コードよりも早く)一致

fileencoding、fileencodings、encodingが以下のような設定値になっている場合です。

#ファイル
fileencoding=utf-8
 
#vimrc
set encoding=cp932
set fileencodings=ucs-bom,sjis,utf-8,cp932

fileencodingsの中に、utf-8よりも先にsjisを入れました。

上記のケースでutf-8で保存されたファイルを開くと、「sjis」の文字コードで開かれてしまいます。

理由としては、ucs-bom→sjis→utf-8と左から順番に開くことができるか試していき、「sjis」で開けると判断されてしまうためです。

まとめ

検証を踏まえた上で、Vimのfileencodingsの並び順を次のように設定することをおすすめします。

set encoding=utf-8
set fileencodings=iso-2022-jp,ucs-bom,sjis,utf-8,euc-jp,cp932,default,latin1

設定のポイントは、文字化けさせたくない制限が多い文字コードを先に設定することです。utf-8やcp932等は開けるファイルの種類が多いので後ろの方に設定しておきます。

以上、Vimエディタで文字コードを自動認識して判定/判別する方法でした。

IT・デジタル
Howpon[ハウポン]

コメント