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

From: Watson <watson1978@...>
Date: 2014-01-09 06:33:32 UTC
List: ruby-dev #47880
Ruby 2.1.0 の NEW に Dir.glob の仕様変更について記載がないようなので、
追記していただければ同様のことで苦しまれる方が減るのかと思われます。


(Thu Jan 9 15:02:43 2014), NARUSE, Yui wrote:
>
> 「ファイルが存在するか」のチェックでしたら、Dir.globで取得したものと比 
> 較ではなく、
> File.exist?(ファイル名)の方がいいですよ。
>
> 2.1のString#encodeは一通り確認して実際のファイルシステムと同じように動 
> くようにしたつもりですが、
> 将来のバージョンで挙動が変化する可能性はありますし、
> HFS+は通常case insensitiveでマウントされますから、HFS+と同じcase 
> insensitiveな比較も必要です。
> で、もちろんcase sensitiveでマウントされることもありえます。
>
> などを考慮すると、素直にファイルシステムに聞くのが一番です。
>
>
> 2014年1月9日 10:17 Watson <watson1978@gmail.com>:
>>
>> 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

Prev Next