From: "NARUSE, Yui" Date: 2008-05-08T03:16:59+09:00 Subject: [ruby-list:44899] Re: Dir.entriesのエンコーディング (was Re: Ruby 1.9のARGVのエンコーディング) 成瀬です。 U.Nakamura wrote: > In message "[ruby-list:44887] Re: Dir.entriesのエンコーディング (was Re: Ruby 1.9のARGVのエンコーディング)" > on May.02,2008 18:17:25, wrote: >>> Dir.entriesだけを取ってみるならば、こうするのがいけない理由が >>> 思いつきません。 >>> # が、Dir.globなどに考えを広げるとちょっと悩ましい >> この手の引数や戻り値の encoding を指定する必要があるものは数ありまして、 >> それらを考慮に入れるとちょっと慎重な方がいいかなぁと思っています。 > > 慎重に検討すべきであるということには同意します。 > ですが、1.9.1までにちゃんと結論を出さないといけないであろうと > いうことも思っています。 そうですね。 なので、とりあえず問題整理もかねて結論を出しやすい所から、 先行して実装してしまった方がいいかなぁと思っています。 >> open をハッシュに対応させるパッチとかも手元にはあるんですが、 >> これも名前的な意味で保留していたりします。 > > :filesystemencoding => みたいなのですか? 趣旨としては :encoding では何の encoding を指定しているのかわからない。 かといって、:filesystemencoding だとわかりづらいし、汎用性に欠ける。 mode を流用して "utf-8:euc-jp" だと汎用性は高いけどこれもまたいかがなものか、 とか、そんな感じです。 > ここで「rubyが知ってる場合」というのはプラットフォーム固有の > 事情を勘案しています。 > そうじゃない場合、rubyは知りようがない、でいいんじゃないか( > localeと異なるなら常に指定が必要)と思うんですがどうですか。 プラットフォーム固有の事情をどこで実装として持たせるかが気になりました。 が、そういった実装の先の話でいいかな。 > 先の私の提案をパターン別で分けると以下のようになります。 > なんか無駄に長いです。 > > (中略) > > ※引数および結果の暗黙の変換、および、引数の明示変 > 換が必要になるので、validでないパスを指定する/が > 返る場合に問題 > > 問題のあるパターンの救済方法はどうしたもんですかね。 > やっぱダメか、これ? まず、このうち変換がおこなわれないパターンについては特に問題ないですよね。 (実際には、引数のディレクトリパスが US-ASCII か ASCII-8BIT の場合には、  結果を変換しないとかが入るのかな) こちらはとりあえずパッチを用意しておきます。 一方で、変換を行うと問題が発生する可能性があるわけです。 そのため、必要のない変換は極力避けるべきでしょう。 つまり、 (A) ファイルシステムのエンコーディングをrubyが知らないプラッ トフォーム(UNIX等)の場合 (a) ファイルシステムのエンコーディングとlocaleが同じ場合(UTF-( (あ) 引数のエンコーディングがファイルシステムやlocaleと同 じ場合(UTF-8) (イ) 結果のエンコーディングとしてファイルシステムやlocale や引数と異なるものが欲しい場合(EUC-JP) eucfiles = Dir.entries(utf8path).map{|e|e.encode('euc-jp')} または eucfiles = Dir.entries(utf8path.encode('euc-jp')) の後者には問題があると考えられます。 言うまでもなく前者も冗長なので、おそらく :result_encoding あたりが必要なのでしょう。 eucfiles = Dir.entries(utf8path, result_encoding: 'euc-jp') このほかある程度グルーピングできると思うのですが、ちょっとそれはまた改めて。 -- NARUSE, Yui