OSXでのファイル名比較
OSXのファイル名について教えてもらったこと
を拝見しとっても興味深かったので私も試してみました。
% touch るびー
% mkdir が
% ls -F
test.rb が/ るびー
% cat -n test.rb
1 # coding: utf-8
2
3 Dir.entries('.').each do |d|
4 next if d =~ /^\.|rb$/
5 printf("name=%s, size=%d, encoding=%s\n", d, d.size, d.encoding)
6 d = d.encode('utf-8', Encoding::UTF8_MAC)
7 printf("name=%s, size=%d, encoding=%s\n", d, d.size, d.encoding)
8 end
結果
% ruby192old -v test.rb
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]
name=が, size=2, encoding=UTF-8
test.rb:6:in `block in <main>': uninitialized constant Encoding::UTF8_MAC (NameError)
from test.rb:3:in `each'
from test.rb:3:in `<main>'
%
% ruby192 -v test.rb
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.6.0]
name=が, size=2, encoding=UTF-8
name=が, size=1, encoding=UTF-8
name=るびー, size=4, encoding=UTF-8
name=るびー, size=3, encoding=UTF-8
1.9.2p136 で動きました。
1.9.2p0 で動かないことも気になるので Encoding.list をみてみます。
% ruby192old -ve "p Encoding.list"
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]
[#<Encoding:ASCII-8BIT>, #<Encoding:UTF-8>, #<Encoding:US-ASCII>]
あれ?なんか少ないような気が...。
% ruby192 -ve "p Encoding.list"
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.6.0]
[#<Encoding:ASCII-8BIT>, #<Encoding:UTF-8>, #<Encoding:US-ASCII>, #<Encoding:Big5>, #<Encoding:Big5-HKSCS>, #<Encoding:Big5-UAO>, #<Encoding:CP949>,
...たくさんあるので以下省略
1.9.2p136 (2010-12-25 revision 30365) の Encoding.list は
1.9.2p0 (2010-08-18 revision 29036)
のそれとは全然違うようです...。
Encoding.list からutf だけをgrep
% cat -n test.rb
1 # coding: utf-8
2
3 a = Encoding.list
4 p a.map{|x| x.to_s}.grep(/utf/i)
# なぜ map して to_s しているかというと...配列に対して grep かけるにはその配列の要素が String クラスでないとうまくいかない。
# けれどEncoding.list が返した配列、を構成する要素のクラスは Encoding クラスなので String クラスに変える必要があるから。
結果
% ruby192old test.rb
["UTF-8"]
% ruby192 test.rb
["UTF-8", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE", "UTF-7", "UTF8-MAC", "UTF8-DoCoMo", "UTF8-KDDI", "UTF8-SoftBank"]
ruby 1.9.2p136 (2010-12-25 revision 30365) にはいろんな種類の UTF があるけど、
UTF8-MAC は ruby 1.9.2p0 (2010-08-18 revision 29036) にはない?! 。
今度は encode の逆の指定。
1 # coding: utf-8
2
3 str = "が"
4 p str.size
5 p str.encode('UTF8-MAC', 'utf-8').size
結果
% ruby192 test.rb
1
2
"が" をutf-8 から UTF8-MAC に変えてみるとsize 1から2に変化しました。
ちょっと rurema で再確認。
% rurema String#encode
...
self を指定したエンコーディングに変換した文字列を作成して返します。引数
を2つ与えた場合、第二引数は変換元のエンコーディングを意味します。さもな
くば self のエンコーディングが使われます
...
最後に iTunes Music Folder の中を検索テスト。
先ずは encode 変換しないでそのまま検索。
% cat -n test.rb
1 # coding: utf-8
2 # いかにもそれらしきもの(濁音などを含む)を選んでおく
3 ary = ["東京スカパラダイスオーケストラ", "Yael Naim", "Yael Naïm"]
4 dir = '/path/to/itunes/music/'
5
6 a = Dir.entries(dir)
7 a.each{|x|
8 p x if ary.index(x)
11 }
結果
% ruby192 test.rb
"Yael Naim"
濁音を含む"東京スカパラダイスオーケストラ" と 特別な文字を含む "Yael Naïm" これら2つの folder は存在しているのにヒットしない。
下記に書き換え。
6 a = Dir.entries(dir)
7 a.each{|x|
8 # p x if ary.index(x)
9 u = x.encode('utf-8', 'UTF8-MAC')
10 p x if ary.index(u)
11 }
結果
% ruby192 -v test.rb
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.6.0]
"Yael Naim"
"Yael Naïm"
"東京スカパラダイスオーケストラ"
期待どおりにヒットしました!
さらに ascii_only な文字を encode しなくてすむようにこんな風にしてみても
6 a = Dir.entries(dir)
7 a.each{|x|
8 (x.ascii_only?) ? u = x : u = x.encode('utf-8', 'UTF8-MAC')
9 p x if ary.index(u)
10 }
同じ結果を得ることができましたー。
[関連記事]
<http://midorex.blogspot.com/2010/02/utf8-mac.html>
<http://midorex.blogspot.com/2010/02/utf8-mac-2.html>
0 件のコメント:
コメントを投稿