hg-fixutf8 を改造してみた

hg-fixutf8 は、出力しようとしているutf-8文字列の中に、現在のコードページで出力できない文字が存在した場合、SetOutputCP(65001) して utf-8 をそのまま出力する。
でも、これ、実際にやってみるとコードページを切り替えるときにコンソールの内容が化けたり、フォントが切り替わる影響でウィンドウが変な挙動をする。

WindowsのコンソールでUnicodeを扱っているほかのプログラムを見てみると、WriteConsoleW() という関数を使うことでutf-16の文字列をそのまま出力できることがわかった。
なので、WriteConsoleW()を使うバージョンの hg-fixutf8 を作ってみた。
http://bitbucket.org/methane/hg-fixutf8-jp/

今のところ、実行後しばらくコンソールが固まるというバグがある。そういえばmsysのlsコマンドをbashを使ってない状態で実行すると同じような現象になったな。なにかしらフラッシュの処理が抜けている予感。

hg-fixutf8 はコマンドライン引数もGetCommandLineW() を使って取得しているし、あとはhgのGUI周りがUnicodeコマンドライン引数を渡すようになったら完璧かもしれない。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。