2009/01/22

utf8-mac-filename

テスト用のファイルをデスクトップで作って (encode_test.rb) ruby 1.9.1で実行すると下記のような結果になった。
日本語がまざっていたらちゃんと UTF8-MAC になってる。けれど、dir1 と dir2 は、同じディレクトリを指しているにもかかわらず結果は異なるようだ。なんでだろう。
dir1 を文字列としての絶対パスにしたら .expand_path を使ったときと同じ結果になった。Dir.pwd だけは別なのかな。よくわからない。

encode_test.rb
ruby 1.9.1 (2008-12-30 patchlevel-0 revision 21203) [i386-darwin9.6.0]

# -*- coding: utf-8 -*-
# encode_test.rb

require 'find'

def files_enc(d)
  Find.find(d){|path|
    Find.prune if path =~ /.DS_Store/
     f_name = File.basename(path)
     f_enc = f_name.encoding.name
     puts ":#{f_enc}=>#{f_name}\n"
  }
  puts "----\n"
end

dir1 = Dir.pwd
files_enc(dir1)
dir2 = File.dirname(File.expand_path(__FILE__))
files_enc(dir2)

p dir1 == dir2

% ruby19 encode-test.rb
=> 
:ASCII-8BIT=>Desktop
:UTF8-MAC=>名称未設定フォルダ
:UTF8-MAC=>あああ.txt
:US-ASCII=>encode-test.rb
:US-ASCII=>aaaa
:US-ASCII=>.localized
----
:UTF-8=>Desktop
:UTF8-MAC=>名称未設定フォルダ
:UTF8-MAC=>あああ.txt
:UTF-8=>encode-test.rb
:UTF-8=>aaaa
:UTF-8=>.localized
----
true


以上のことからひょっとしたら変更するかもしれないメソッド

def set_path
  mb = true
  ext = @item.title.gsub(/\(.*?\)|\s|\.|:|;|#|%|&|$|@|!/u,'').gsub(/\//,'_')
  path = File.join(dir_text, @item.ean.to_s + "-" + ext + '.txt')
  ext.unpack('U*').each{|x| mb = nil if x > 128}
  path.force_encoding("UTF8-MAC") unless mb
  return path
end

# => 
# ISBN-タイトル名.txt


--imported_from
http://www.midore.net/daybook/2009/01/1232579405.html

+++ 追記 +++
2010-02-06

http://github.com/midore/readbook
はずっと放置したままになっちゃってます。
2009年夏以降 Amazon AWS の仕様がかわったことで今となっては動かせないものとなったままです。

Amazon の新しい仕様に対応した版 http://github.com/midore/amazon-jp-api
amazon-jp-api においては、テキストファイル名に ISBN 番号をふるよう変更しました。

0 件のコメント: