くまのりくふん RSSフィード

 | 

2008-09-24

system() の憂鬱

05:00 | はてなブックマーク - system() の憂鬱 - くまのりくふん

system() の結果は常に encoding として扱われるのだけど*1、こいつを何とかして適切なエンコーディングに変換しようと頑張って駄目だった記録。

作戦1 - fileencodings から変換を試みる

" コマンドの結果が、どのエンコーディングで返ってくるかは分からない
let result = system("hoge")

" よって、既存のファイルを開く時のように fileencodings の値で変換を試みる
let fencs = split(&fileencodings, ",")
" call filter(fencs, "v:val !=# 'ucs-bom' && v:val !=# 'guess'")
for fenc in fencs
  if !(iconv(result, fenc, &encoding) == "")
    let result = iconv(result, fenc, &encoding)
    break
  endif
endfor

echo result

はい、ばっけばけ。

あれ……? iconv() って変換に失敗したら空文字列を返すはずだよな? てことは化けてるけど成功してるのか。

僕の環境に問題があるようで、iconv() の第二、第三引数に何を指定しても変換成功します。化けてるのに。

というか、僕が iconv() の動作を理解してないだけか。こいつは駄目だ。次に行こう。

作戦2 - shell のエンコーディングから変換する

" コマンドの結果は大抵 shell のエンコーディングで返ってくるはずだ!
let result = system("hoge")

" dos なら cp932 で大抵上手くいくはずだ!
if !(iconv(result, "cp932", &encoding) == "")
  let result = iconv(result, "cp932", &encoding)
endif

echo result

作戦1よりはマシか……?

system() の結果のエンコーディングが分かっていれば、こういう方法もありかな。

diff とかだと即死だけど。

作戦3 - Rubyインタフェースを使う

ruby << EOF
require "kconv"
Enc_table = {"iso-2022-jp" => Kconv::JIS, "euc-jp" => Kconv::EUC, "cp932" => Kconv::SJIS, "utf-8" => Kconv::UTF8}
def ruby_kconv(content = "", enc = VIM.evaluate("&encoding"))
  in_code = Kconv.guess(content)
  out_code = Enc_table[enc]
  result = Kconv.kconv(content, out_code, in_code)
  VIM.command("let s:ruby_kconv_result = '" + result + "'")
end
EOF

execute "ruby ruby_kconv('" . system("hoge") . "')"
echo s:ruby_kconv_result

お、想定通り動いてるか? でもこの方法だとプラグインを配布する時に困りそうだな。

○○インタフェースが必要とかいうのはなるべく避けたいな。

作戦4 - 外部ツールを使う

とてもめんどくさいのでやりませんでした。

外部ツールが必要とかいうのはなるべく(ry

結論

:read! hoge

を使え。

JimmyJimmy 2011/11/23 20:36 Good points all around. Truly apperciaetd.

rmzcfwdirmzcfwdi 2011/11/24 20:51 xQS9cb <a href="http://szpqwjkqgfnk.com/">szpqwjkqgfnk</a>

bypmpwwnbypmpwwn 2011/11/25 01:10 Q0pVG9 , [url=http://jkhqmbxdwqfe.com/]jkhqmbxdwqfe[/url], [link=http://udxtjrfbkgpu.com/]udxtjrfbkgpu[/link], http://ntcghvzxthff.com/

apwykzbanapwykzban 2011/12/01 02:29 IyZ7w2 <a href="http://bisgwjztlugq.com/">bisgwjztlugq</a>

iquoibbniquoibbn 2011/12/05 01:54 aMMvxx , [url=http://iaplkwuqezqs.com/]iaplkwuqezqs[/url], [link=http://njnhkrntfvlq.com/]njnhkrntfvlq[/link], http://tvusbbquvice.com/

ゲスト



トラックバック - http://vim.g.hatena.ne.jp/kuhukuhun/20080924
 |