2011/02/16

UTF8-MAC and Encoding.list

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 件のコメント: