From: "U.Nakamura" Date: 2008-05-01T09:46:57+09:00 Subject: [ruby-list:44877] Dir.entriesのエンコーディング (was Re: Ruby 1.9のARGVのエンコーディング) こんにちは、なかむら(う)です。 # Subject変えました In message "[ruby-list:44875] Re: Ruby 1.9のARGVのエンコーディング" on May.01,2008 02:47:19, 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