こんにちは、なかむら(う)です。
# Subject変えました

In message "[ruby-list:44875] Re: Ruby 1.9のARGVのエンコーディング"
    on May.01,2008 02:47:19, <naruse / airemix.jp> wrote:
> 実装コストはあまり気にしてなくて、むしろ UI ですかね。
> Dir.entries(path, :encoding=>"UTF-8") でもまぁいいのかなぁ。

Dir.entriesだけを取ってみるならば、こうするのがいけない理由が
思いつきません。
# が、Dir.globなどに考えを広げるとちょっと悩ましい


> って、いつもの引数文字列のエンコーディングで指定ですか?
> 内部実装向けの hack としては簡潔で素晴らしいとは思うのですが、
> 一般ユーザ向けにはいかがなものかなぁと。

実は成瀬さんの言う「force_encoding」がそういう話なんじゃない
かと思ったりもしてました。
成瀬さんはこの方式にはあまり賛成でない、と。


> > [ruby-list:44864]の例(localeがutf-8でファイルエントリがeuc-jp)
> > だと、例えば、
> > 
> >   files = Dir.entries(eucpath.encode('utf-8')).map{|f|f.force_encoding('euc-jp')}
> > 
> > となる、という意味でしょうか?
> 
> こちらはそういう想定でした。

つまり、戻ってくる文字列は実際のエンコーディング(rubyは知って
るかもしれないし知らないかもしれない)と関わりなく、常にlocale
のエンコーディングが設定されているということですか。
その場合、localeのエンコーディングでは不正となるバイト列が返
されたら何が起きるんでしょう?
勝手にASCII-8BITになる? それとも例外?


Dir.entriesの場合、話に出てくるエンコーディングは3つありえて、
  (1) 引数であるパス指定のエンコーディング
  (2) 実際のファイルシステム上のエントリのエンコーディング
  (3) 結果配列内の各文字列のエンコーディング
となります。
(1)は引数自体が知ってるから問題ないですね。
(2)は、rubyが知っている環境もあれば、rubyが知らない環境もあり
ます。
(3)は、少なくともスクリプト作者はどのエンコーディングで結果が
欲しいかを知っているはずで、それは多くの場合(1)と同じだろうと
は推測できます。

以上の考察から、私の提案はこうです。

  * (3)は(1)と同一とみなして適宜変換する
  * (2)のデフォルトはlocale(rubyが知っている場合はもちろんそ
    れを使う)とし、別途オプション引数等で指定可能とする
  * もし(1)と異なるエンコーディングで(3)が欲しいという特殊な
    事態があれば、それはスクリプト作者が(1)をどうにかする
  * (1)がUS-ASCIIでかつ(2)がいわゆるASCII互換でない場合、locale
    またはオプション引数で指定されたエンコーディングを(3)に用
    いる

こうすると、例えば、まつもとさんの環境でUTF-8で結果が欲しけれ
ば、
  files = Dir.entries(utf8path, :encoding => 'euc-jp')
となるでしょうし、私の環境(日本語版Windows)でWindows-31Jで結
果が欲しければ、ファイルシステムのエンコーディングはrubyが知
っているので、
  files = Dir.entries(sjispath)
となるでしょう。


それでは。
-- 
U.Nakamura <usa / garbagecollect.jp>