[ruby-dev:47878] Re: [Mac OS X] Dir.glob で取得したファイル名のバイト列が異なる

From: Watson <watson1978@...>
Date: 2014-01-09 01:17:17 UTC
List: ruby-dev #47878
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 <watson1978@gmail.com>:
>> ご返答ありがとうございます。
>>
>> 仕様変更ということなので、今後再び振る舞いが変わることがなさそうなので、
>> 現在、私が遭遇している問題についてはこちらで対処したいと思います。
>>
>>
>> ありがとうございました。
>>
>> (2014/01/09 9:53), NARUSE, Yui wrote:
>>> 端的には仕様変更です。
>>> 長大な議論の果てに変更されたわけなのですが、詳細をすぐには思い出せないので、
>>> さしあたっては http://bugs.ruby-lang.org/issues/7267 を御覧ください。
>>> 解説が必要でしたら解説します。
>>>
>>> 2014年1月3日 16:33 Watson <watson1978@gmail.com>:
>>>> 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
>>>
>
>

In This Thread