From: Watson Date: 2014-01-09T10:17:17+09:00 Subject: [ruby-dev:47878] Re: [Mac OS X] Dir.glob で取得したファイル名のバイト列が異なる RubyMotion で iOS/OSX アプリをビルドする際に CRuby を使用しております。 ビルドする途中で、ユーザが指定したアプリ名のファイルが存在しているか チェックする処理があり、Dir.glob を用いてファイル名を取得しております。 以前 String#encode で Normalization Form D から Normalization Form C へ 変換できない問題があり報告しております。 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/47680 そのため、ユーザがアプリをビルドする際に CRuby 1.8、1.9 や 2.0 を利用し ていても 動くようにファイル名を扱う箇所を Normalization Form D で統一していたため、 今回報告した内容について遭遇した次第です。 (2014/01/09 10:04), NARUSE, Yui wrote: > OS XのHFS+上のファイル名をRubyでどう扱うべきかについては、 > 今でも知見が十分に得られているとは言い難いので、 > どのような問題に遭遇したのか共有していただけると助かります。 > > 2014年1月9日 10:02 Watson : >> ご返答ありがとうございます。 >> >> 仕様変更ということなので、今後再び振る舞いが変わることがなさそうなので、 >> 現在、私が遭遇している問題についてはこちらで対処したいと思います。 >> >> >> ありがとうございました。 >> >> (2014/01/09 9:53), NARUSE, Yui wrote: >>> 端的には仕様変更です。 >>> 長大な議論の果てに変更されたわけなのですが、詳細をすぐには思い出せないので、 >>> さしあたっては http://bugs.ruby-lang.org/issues/7267 を御覧ください。 >>> 解説が必要でしたら解説します。 >>> >>> 2014年1月3日 16:33 Watson : >>>> Ruby 2.0 までは OS X のファイル名を Dir.glob で取得したときには >>>> OS X ファイルシステムが返す Normalization Form D バイト列が Dir.glob で >>>> 取得されておりました。 >>>> >>>> Ruby 2.1 からは Normalization Form C に変換したバイト列が Dir.glob で >>>> 取得されるようになっているようなのですが、仕様が変わったのでしょうか? >>>> >>>> % cat test.rb >>>> system "touch 'が'" >>>> Dir.glob("*").each do |file| >>>> next if file == $0 >>>> puts "** #{file} **" >>>> file.each_byte do |b| >>>> p b >>>> end >>>> end >>>> >>>> % ruby -v test.rb >>>> ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13] >>>> ** が ** >>>> 227 >>>> 129 >>>> 139 >>>> 227 >>>> 130 >>>> 153 >>>> >>>> % ruby -v test.rb >>>> ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin13.0] >>>> ** が ** >>>> 227 >>>> 129 >>>> 140 >>> > >