Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

readfile()でファイルを読み込んでからiconv()で文字エンコーディングを変換する

$
0
0

環境Debian 8.5/Vim 7.4.1902

readfile()でファイルを読み込んでも自動的に文字エンコーディングの変換をしてくれません。
iconv()も自動的に文字エンコーディングを判断して変換してくれないので、事前に文字エンコーディングを調べる必要があります。

サンプルでは文字エンコーディングcp932で保存したファイルcp932.txtを読み込ませます。

cp932.txt

Vim起動

vim -Nu NONE -S sample.vim

サンプルスクリプト

sample.vim
letfilename='cp932.txt'letf= readfile(filename)
echo f

結果

['<82><a0>']

リストに含まれる値がバイナリで表示されてしまいました。
['あ']が表示されません。
どうにかして['あ']を表示させたいので方法を調べました。

バッファにファイルを開いて文字エンコーディングを取得してから変換する

fileencodingsを設定する必要があります。
cp932.txtを新規バッファに開くと、&fileencodingで文字エンコーディングが取得できます。

tabeditを実行した時に自動コマンドが発動しないように、noautocmdを使って一時的に自動コマンドを無効にしています。

Vim起動

vim -Nu NONE -S sample1.vim

サンプルスクリプト

sample1.vim
setfileencodings=ucs-bom,utf-8,euc-jp,sjis,cp932,default,latin1
letfilename='cp932.txt'
execute 'noautocmd tabedit ' . filenameletenc=&fileencodingbwipeoutletf= readfile(filename)call map(f,'iconv(v:val, enc, &encoding)')
echo f

結果

['あ']

文字エンコーディングが変換されて['あ']と表示されました。

外部プログラムで文字エンコーディングを取得してから変換する

外部プログラムでファイルの文字エンコーディングを調べてから変換する方法です。
サンプルではPHPを使って文字エンコーディングを取得しています。
このサンプルを動かすにはPHPが利用できる環境が必要です。

Vim起動

vim -Nu NONE -S sample2.vim

サンプルスクリプト

sample2.vim
letfilename='cp932.txt'let phpcmd ="php -r " .
            \ "\"mb_detect_order('UTF-8,eucJP-win,SJIS-win');" .
            \ "echo mb_detect_encoding(" .
            \ "file_get_contents('" . filename . "'));\""letenc= system(phpcmd)letf= readfile(filename)call map(f,'iconv(v:val, enc, &encoding)')
echo f

文字エンコーディングが変換されて['あ']と表示されました。

その他

iconv()の第二引数に渡せる文字エンコーディング名については、Linuxではターミナルでiconv -lを実行すると確認できます。

今回は試してませんが拡張インターフェース(if_pyth、if_rubyなど)を使って文字エンコーディングを取得することも出来ると思います。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>