From: "NARUSE, Yui" Date: 2008-07-04T02:41:47+09:00 Subject: [ruby-dev:35347] Re: Win32 Unicode console output 成瀬です。 U.Nakamura wrote: > こんにちは、なかむら(う)です。 > > In message "[ruby-dev:35343] Re: Win32 Unicode console output" > on Jul.04,2008 01:15:04, wrote: > | > とりあえず、次はGetCommandLineW()だろう、と思ってコードを見な > | > がら考えたのですが、当たり前ですがコマンドライン引数の解釈が > | > 終わるまでdefault_externalは確定できないのでした。 > | > > | > 一度GetCommandLineA()で解釈した後、default_externalが決まった > | > らやりなおすのかなあ。できるんだろうか。 > | > | GetCommandLineW() で解釈して、default_external に > | 変換すればいいんじゃないですかね。 > | > | GetCommandLineA() では Windows がやっていることを、 > | Ruby の側でやるように変えるだけかな、と。 > > えーと、WindowsというかCスタートアップルーチンが作成してくれ > るargc,argvはmswin32(など)では使ってません。 > つまり、現状既にGetCommandLineA()で取得した内容を自前で解釈し > ています。 > 詳しくは、win32/win32.cのrb_w32_sysinit()と、そこから呼ばれる > rb_w32_cmdvector()を参照していただけるとわかるかと。 > で、この際にrubyが持っているglobbingルーチン群を利用してワイ > ルドカード類の展開を行っています。 > > 以上から、さしあたってそびえている壁は、 > (1) どのタイミングでGetCommandLineW()から取ってきたargc,argv > への差し替えを行うかの判断。 ここはもっと単純に、 1. GetCommandLineW() で LPCWSTR を取ってくる。 2. WideCharToMultibyte でひとまず locale に変換 3. locale に変換した文字列を今までどおり解釈 4. default_external が locale だったらおしまい 5. 違ったら、LPCWSTR を default_external に変換しなおす 6. それを解釈 (解釈部の非コードページエンコーディング対応が必要) 7. おしまい ということでは。 > (2) rb_w32_cmdvector()の非コードページエンコーディング対応。 これは CharNext() だけですかね・・・? > (3) globbingルーチン群の非コードページエンコーディング対応。 こちらは Next(), Inc(), Compare() でしょうか。 downcase とかもなのか・・・? あと、全部に encoding 渡すようにしないといけませんね。 > ずっと目をそむけていたのですが、思いのほか早くglobbingの多言 > 語対応の必要性が目の前に出てきましたねえ... やはりやつとは戦わねばならない運命なのか・・・。 -- NARUSE, Yui