From: KIMURA Koichi Date: 2007-12-28T13:33:05+09:00 Subject: [ruby-dev:32843] Windowでのデフォルトエンコーディング 木村です。 Windows版の 1.9.0-0の動作なんですが、 irb(main):001:0> RUBY_VERSION => "1.9.0" irb(main):002:0> "".encoding => # irb(main):003:0> p "こんにちは世界" "\x82\xB1\x82\xF1\x82\xC9\x82\xBF\x82\xCD\x90\xA2\x8AE" => "\x82\xB1\x82\xF1\x82\xC9\x82\xBF\x82\xCD\x90\xA2\x8AE" irb(main):004:0> 日本語Windowsでこうなってしまうのはちょっと悲しいと思うのですが、 ないか良い手はないですかね? 1) VC++のlibcにある setlocaleは、glibc等のそれとは動作が異なるので setlocale(LC_ALL, "") とか setlocale(LANG, "") を実行しても、対応する環境変数の内容を読み取って適切に設定してくれること はない。 2) そもそも現状で mswin32版は setlocale を実行していない(HAVE_LOCALE_Hが undef)。 3) Windows APIのロカール関係の設定に使われるlocale IDとISOの国コードとか の対応をとるのが面倒。 実はわたしが首を突っ込んでいる xgawk でこの種の問題にぶちあたって、その 対策としてsetlocale (とそれに付随して必要になる関数)を置き換えるものを 作ってたんですが、ライブラリが抱えている情報と矛盾しないようにするのが 面倒でまだ完成してません。 #一応動くようには見えるけど、いじめると危ないはず 3) については面倒ではありますが不可能ではないです。 Win32::Locale - get the current MSWin locale or language - search.cpan.org http://search.cpan.org/~sburke/Win32-Locale-0.04/Locale.pm とか Win32::Codepage - get Win32 codepage information - search.cpan.org http://search.cpan.org/~clotho/Win32-Codepage-1.00/lib/Win32/Codepage.pm あたりが参考にできると思います。 とりあえず単なる問題提起(らしきもの)です。すみません。 -- 木村浩一