curluneの日記

日々試行錯誤。雑多に、気ままに、てきとーに。HoloLens/Oculus Rift,Touchと戯れる日々。

vimのエンコーディングいろいろ ひとりぷちアドベントカレンダー2017 17日目

vimエンコーディング周りのメモです。

エンコーディングを指定して開き直す

化けてしまって別の設定で開き直したい時に使います。 大体はこのあたりのどれかでok。utf-8utf8でも大丈夫です。

:e ++enc=shift_jis
:e ++enc=cp932
:e ++enc=utf-8

場合によっては先に内部エンコーディングを変えておいた方が良いかもしれません。

set encoding=utf-8

エンコーディングを指定して保存する

開くのではなく、今のファイルを別の設定で保存したい時に使います。

:set fileencoding=utf-8

文字化けしにくいようにする

文字エンコーディングの候補を設定すると文字化け確率を減らせます。もちろん、候補に無い物は化けます...。

:set fileencodings=ucs-bom,utf-8,cp932

最初のucs-bomは少し特殊な物で、バイトオーダーマーク(BOM)関係です。最初に入れておくと良いと思います。

候補の指定にはfileencodingsで、最後にsが必要です。fileencodingとは別のものです。

エンコードの判定

そもそもテキストファイルというものは、文字エンコードについての情報を持っていません。

そのため、各種エディタはいろいろ試して(あるいは固定)でエンコードを推測してくれています。

vimの場合は、候補リストのfileencodingsと内部エンコーディングencodingを使って推測してくれます。

  • fileencodingsの先頭の設定で開いてみる。
    • 成功した場合は確定!
    • 失敗した場合は、次の設定で繰り返す。

成功/失敗は、不正なバイト列があるかどうかで決まります。 なので、中身が空の場合や文字が少なく偶然成功した場合は、先頭の方の候補として誤認識される場合もあります。

ゴミが入っている場合も失敗します。utf8なファイルだけど、壊れたバイトが含まれてしまっているという場合は失敗にしてしまいます。 以前にディスクがあふれて途中まで書きこまれ、壊れたバイトを含むため正しく開けない、なんてことがありました。

終わりに

テキストファイルさん、エンコード情報何処かに持っていてほしかったなあ。