fudist

ホーム‎ > ‎vim UTF-8日本語版‎ > ‎

vimの文字化けについて



vim/gvimで日本語ファイルが文字化けするのは、大抵は以下のどちらかです。
  • vim/gvimの内部エンコードがcp932であるのにcp932で扱えない文字を含むファイルを開く場合
  • ファイルエンコーディングを誤認識する場合
utf-8にはcp932では扱えない文字が含まれています。
Windowsの vim/gvimは内部エンコーディングのデフォルトが cp932なので utf-8でしか表示できない文字が含まれたファイルの場合は当然文字化けします。
この場合の対処としては、 vim/gvimの内部エンコーディングを utf-8にするしか有りません。
vim/gvimのUTF-8化とファイルの文字コード自動認識

ファイルエンコードの誤判定については vim/gvim固有の問題ではないのですが、文字エンコードの自動判定を設定していても使用している日本語文字種が少ない utf-8のファイルは cp932(Shift_JIS)と判定されることがあります。

例えばファイルの内容が "ああ" だけの BOM無し utf-8 のファイルなどは、他のエディタでも誤判定する場合があります。
Windows用エディタでは cp932を優先的に判定している場合が多いのでわりとよく見られます。

("ああ" だけのutf-8ファイルが、cp932と判定されて "縺ゅ≠"として文字化けしている様子)

自動判定に失敗して文字化けしたファイルを手動で、文字エンコードにutf-8を指定して読込直すには次のようにします。
:e ++enc=utf-8
gvimならファイル(F)メニューからも読み込み直せます。

対処方法

vimの文字コードの自動判定は、fileencodings の順番に変換をしてみて、エラーが出なかったらそのファイルエンコードと見なす、という処理を行っています。
"ああ" だけのBOM無し utf-8 ファイルは、cp932のファイルとしてみれば、人間の目からはおかしいですが文字コード列としては破綻していません。
"あああ" だと cp932の文字列としては破綻するので utf-8として認識されます。

主にutf-8のファイルを扱っていて、cp932と見なされるファイルが多いようなら、fileencodingsの順番をutf-8が先に来るようにしてやると解決します。
変更すると逆に cp932 のファイルが utf-8 と見なされる可能性は当然ありますので、扱うファイルのエンコードがどちらが多いかなどを考えてから変更して下さい。

順番はコマンドモードから確認できます。
:set fileencodings

_vimrc(unixなら .vimrc) の 最終行に以下を追加すると、 utf-8優先になります。
" utf-8優先簡易版
let &fileencodings=substitute(substitute(&fileencodings, ',\?utf-8', '', 'g'), 'cp932', 'utf-8,cp932', '')
元の fileencodings の順番を考慮して cp932 と utf-8 の順番を置換するなら以下の通りになります。
" utf-8優先
let &fileencodings = substitute(&fileencodings, 'utf-8', '_utf-8', 'g')
let &fileencodings = substitute(&fileencodings, 'cp932', 'utf-8', 'g')
let &fileencodings = substitute(&fileencodings, '_utf-8', 'cp932', 'g')