From: Martin Duerst Date: 2008-07-06T14:54:54+09:00 Subject: [ruby-dev:35376] Re: Win32 Unicode console output 成瀬さん、中村さん、こんにちは。 この話にもうちょっと貢献できればいいと思っていますが、 なかなか時間が取れません。 念のため一つだけ行っておきたいです: 日本の場合にはたまたま DOS/コマンドシェルが使っている 「OEM」文字コードと Windows が使っている「ANSI」文字コード が両方とも CP 932 で同じですが、世界中にそうでないところが いっぱいあります (ヨーロッパ、北米)。 この話にどのぐらい関係ありますかよく分かりませんが、 是非ヨーロッパとかのユーザにも使ってもらって、動作確認など 取った方がいいかと思います。 宜しくお願いします。 Martin. At 02:41 08/07/04, you wrote: >成瀬です。 > >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 #-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University #-#-# http://www.sw.it.aoyama.ac.jp mailto:duerst@it.aoyama.ac.jp