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
関連
- viの基本操作
- viの応用操作
- viの正規表現
- viで複数ファイルの編集
- viの画面分割
- viのFileExplorer
- viのコマンド実行
- viのsetコマンド一覧
- viの文字コードについて
- viの設定ファイル