viの文字コードについて

文字コードについて

vimは標準で文字コードの自動判別や変換処理に対応しているので、どのような文字コードで書かれたファイルでも編集することは可能です。

しかし、自動判別を正しく行うためには、明示的に文字コード変換設定を行う必要があります。


文字コード設定

設定ファイル「.vimrc」に記載します。



:set encoding=utf-8
:set fileencodings=ucs-bom,iso-2022-jp-3,iso-2022-jp,eucjp-ms,euc-jisx0213,euc-jp,sjis,cp932,utf-8

encoding(enc)

vimの内部で使用されるエンコーディングを指定します。


fileencoding(fenc)

編集時のバッファファイルのエンコーディングを指定します。

encodingと異なる値が設定されていた場合、ファイルの読み書き時に文字コードの変換が行なわれます。

fencが空の場合、encodingと同じ値が指定されているものとみなされ、変換は行なわれません。


fileencodings(fencs)

既存ファイルを編集する際に、変換予定となる文字コードを指定します。

文字コードは複数記述可能であり、カンマ区切りで列挙します。

ファイルを読み込む際に、「指定文字コード→encodingの文字コード」の変換が試行され、最初にエラー無く変換できたものがそのバッファのfenc値に設定されます。

fencsに列挙された全ての文字コードでエラーが出た場合、fencは空に設定されるため文字コードの変換は行われません。


文字コード変換コマンド

コマンドにより、文字コードの操作が可能です。


文字コード変換

文字化けしたファイルを指定文字コードで開き直すことができます。


:e ++enc=(文字コード)

ex) :e ++enc=cp932
ex) :e ++enc=utf-8

文字コードの確認


:set enc?

ファイルエンコードの確認


:set fenc?

自動判別の設定確認


:set fencs?

文字コードを変換する

指定文字コードに変換して保存します。


:set fenc=(文字コード)
ex) :set fenc=utf-8

設定ファイル例


" 文字コードの自動認識
if &encoding !=# 'utf-8'
  set encoding=japan
  set fileencoding=japan
endif
if has('iconv')
  let s:enc_euc = 'euc-jp'
  let s:enc_jis = 'iso-2022-jp'
  " iconvがeucJP-msに対応しているかをチェック
  if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'eucjp-ms'
    let s:enc_jis = 'iso-2022-jp-3'
  " iconvがJISX0213に対応しているかをチェック
  elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'euc-jisx0213'
    let s:enc_jis = 'iso-2022-jp-3'
  endif
  " fileencodingsを構築
  if &encoding ==# 'utf-8'
    let s:fileencodings_default = &fileencodings
    let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
    let &fileencodings = &fileencodings .','. s:fileencodings_default
    unlet s:fileencodings_default
  else
    let &fileencodings = &fileencodings .','. s:enc_jis
    set fileencodings+=utf-8,ucs-2le,ucs-2
    if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$'
      set fileencodings+=cp932
      set fileencodings-=euc-jp
      set fileencodings-=euc-jisx0213
      set fileencodings-=eucjp-ms
      let &encoding = s:enc_euc
      let &fileencoding = s:enc_euc
    else
      let &fileencodings = &fileencodings .','. s:enc_euc
    endif
  endif
  " 定数を処分
  unlet s:enc_euc
  unlet s:enc_jis
endif
" 日本語を含まない場合は fileencoding に encoding を使うようにする
if has('autocmd')
  function! AU_ReCheck_FENC()
    if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
      let &fileencoding=&encoding
    endif
  endfunction
  autocmd BufReadPost * call AU_ReCheck_FENC()
endif
" 改行コードの自動認識
set fileformats=unix,dos,mac
" □とか○の文字があってもカーソル位置がずれないようにする
if exists('&ambiwidth')
  set ambiwidth=double
endif


関連