俺と Win32 コンソール(2):半分冗談で msvc/mingw32 用のオレオレ getch を模索してみた

いわゆる「澤」問題。よりくわしく言うと「getch でカーソルキーとか押すと 0xE0 のプレフィックスがついちゃって DBCS 入力にものすごくさしさわりがってゆうかこれじゃカーソルだか 2byte 文字だか判別しようがねーだろゴルァ」問題。(詳しいの?それって詳しいの?)。
ちなみにプレフィクスが 0xE0 になるのって実はマイクロソフトのランタイムだけっぽいのさ…そもそも <conio.h> の関数って dos 時代に作られた dos 特化のコンソール入出力関数なのに、この件に限って言えばマイクロソフトだけが dos 時代の Microsoft C/C++ と挙動が違うんですよ(dos 時代の _getch はカーソルキー押してもプレフィクスは 0xE0 にならない。0 のまま)。ちなみに Borland とかの他社製は dos 時代の仕様に合わせてたりする。テンキー統合のカーソルキーと独立のカーソルキーを別個に判別したいという需要があったのかもしれないけど、それならそれ相応の関数を別に作っても良かったじゃん…。

つまり何が言いたいかと申しますと、MS の _getch は DBCS 入力のことなんてなーんも考えておらんということです。ここで採りうるソリューション:

  1. _getch をあきらめる。Win32 のコンソールAPI を自前で使う(_getch 代替関数の作成も含めて)
  2. Microsoftmingw をあきらめる。Borland, DigitalMars, OpenWatcom の検討
  3. DBCS をあきらめる(その1)。コンソールで日本語なんて入力しませんよJK
  4. DBCS をあきらめる(その2)。_getwch で Unicode 受け(さようなら Win9x)。

いちばん正しい道は 1. だと思うのですが、個人的な趣味により、もっとも変態的なアプローチを考えてみました。

続きを読む