UTF8-MAC みなおし。
要は \\ があればいいんでしょ?とお気楽な発想を展開してみました。
が、以下は非常によろしくないことをしている可能性あり。
あくまでも実験なので試さない方がいいです。おい
macustr.rb
1 #!/usr/local/bin/ruby19
2 # coding: utf-8
3
4 exit unless Encoding.default_external.name == 'UTF-8'
5
6 require 'nkf'
7 def macustr(line)
8 str = String.new # p str.encoding
9 line.chars.entries.each{|x| str << "\\" + x}
10 #line.codepoints.entries.each{|x| str << "\\" + [x].pack("U*")}
11 mustr = NKF::nkf('--ic=UTF-8 --oc=UTF8-MAC', str)
12 return mustr
13 end
14
15 ARGF.each{|line|
16 exit unless line.encoding.name == "UTF-8"
17 next unless line.valid_encoding?
18 mustr = macustr(line.strip)
19 next unless mustr.valid_encoding?
20 sh = system("mkdir #{mustr}")
21 print "Maked Directory: #{line}" if sh
22 }
23
line 4 : 環境変数LANGが UTF-8 でない場合はおいかえす。
line 16: 読み込んだ文字列が UTF-8 でなければすぐ終了。
line 17: valid でなければ次
line 18: def macustr に一行わたす
line 9 : 冒頭に"\\" を付け加えて一文字ずつ str に追加。最初は line 10 にしたのだが line 9 にしておいた。
line 11: str を UTF8-MAC に変換
line 19: valid でなければ次
line 20: mkdir コマンド
line 21: コマンドが成功したらメッセージ表示
./macustr.rb utf8_text.txt
を実行すると utf8_text.txt を一行ずつ読み込み
同名のDirectory を同じ階層に作成します。
utf8_text.txt は UTF-8 で保存されたテキストファイル。
[2010-02-27]
s/chomp/strip/g
[2010-03-08]
追記
# 失敗例
1 #!/usr/local/bin/ruby19
2 # coding: utf-8
3 # test-encode.rb
4
5 text = 'utf8-text.txt'
6 # % cat utf8-text.txt
7 # and two &three
8
9 File.open(text, "r:utf-8"){|f|
10 f.each_line{|x|
11 # 行末\n や行頭\s を削除
12 line = x.strip
13 # print out
14 puts "Line: \"#{line}\"| Encoding: #{line.encoding}| Valid: #{line.valid_encoding?}\n"
15 puts "# Calling encode\n"
16 # encode で変換
17 mustr = line.encode("UTF8-MAC")
18 # print out
19 puts "String: \"#{mustr}\"| Encoding: #{mustr.encoding}| Valid: #{mustr.valid_encoding?}\n"
20 print "# Calling system\n"
21 # Directory 作成
22 sh = system("mkdir #{mustr}")
23 puts "Result: #{sh}\n--\n"
24 }
25 }
26
27 =begin
28 % ./test-encode.rb
29 Line: "and two &three"| Encoding: UTF-8| Valid: true
30 # Calling encode
31 String: "and two &three"| Encoding: UTF8-MAC| Valid: true
32 # Calling system
33 sh: three: command not found
34 Result: false
35
36 % ls -F
37 and/ test-encode.rb* two/ utf8-text.txt
38 =end
17行目
mustr = ine.encode("UTF8-MAC")
を
mustr = line.force_encoding("UTF8-MAC")
にしても同様の結果だし
require 'nkf'
mustr = NKF::nkf('--ic=UTF-8 --oc=UTF8-MAC', line)
としてみても結果は同じ
検索して次を読んでみたけど よくわかってないというか...。
<http://redmine.ruby-lang.org/issues/show/1411>
<http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/40233?help>
+++ 感想 +++
通常 Mac OS X を使用する上で自ら日本語名のフォルダを作る人はあまりいないだろうし、スペースが混入した文字列をわざわざフォルダの名前にする人もあまりいないはずなので、じゃあ一体どういった場面で上のような必要が生じるかというと
ずばり
iTunes のための iTunes による Folder 生成 | File 生成なのかな? と。
2010/03/08 現在ではこれ以外の場面で UTF8-MAC への変換なんて一般的には必要とされてないことなのかもしれません。
ただ、今後 iPad が登場しまた新しくiのつく名前のアプリケーションがでてきたりすると UTF8-MAC への変換に対する需要は増えるかもしれませんね?電子書籍を買って読むための iBooks.app が OS X に搭載される日は案外近い将来かもしれません。
iPad
それで、例えば iBooks.app が生成するであろう著書名のついたファイルにアクセスする際、もしも著書名に\& や\s が含まれていたり日本語だったりしたらRuby からそれらのファイルにアクセスしようとするのはちょっと困難がありそうです。いまの iTunes ファイル群と同様に。
# Ruby からはそういうファイル群にアクセスしないから大丈夫...といった意見の人もいるかもしれません。
# あるいは上に書いた失敗例を[ちゃんとした]成功例にする方法を私が知らないだけのことなのかもしれません。
# macustr.rb は一見成功してるようにみえるけどもちゃんとはしていないだろうし。
はたまた違う観点からみた場合、セキュリティ的にどうなんだろう?って問題も私にはよくわからないけどきっとあるんだろうと思います。そっちが優先された上で現在こうなっているのであればこのままの方がうれしい人も多いのかもしれません?。
ということで、幾日経過後のまとまりのない&とりとめないのない感想でした。
# 私が間違った認識をしている可能性は多分にあります。何かお気付きの方はコメントお願いします。
0 件のコメント:
コメントを投稿