2010/02/22

UTF8-MAC

ここを読んで

私も perl でためしてみました。
% cat test.pl

#!/usr/bin/perl
while(<>) {
    chop;
    print "Making a folder $_...\n";
    mkdir();
}

% cat 02.txt

ABC_a'bc 織田 信長
ABC_e'fg 豊臣 秀吉
ふげふが リファレンス& ドロー


% ./test.pl 02.txt
Making a folder ABC_a'bc 織田 信長...
Making a folder ABC_e'fg 豊臣 秀吉...
Making a folder ふげふが リファレンス& ドロー...

わざと\s や ' や濁点や & を入れてみましたがちゃんとおかしな名前のフォルダが出来上がりました。

で、Ruby ではどうなのでしょ。
% cat test.rb

#!/path/to/ruby19
# coding: utf-8
ARGF.each{|line|
  system ("mkdir #{line}")
}


% ./test.rb 02.txt

% ./test.rb 02.txt 
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: ドロー: command not found

こうなるのは予測していたので

http://gihyo.jp/dev/serial/01/ruby/0004?page=2 を読み直し

#!/path/to/ruby19
# coding: utf-8
require 'nkf'
ARGF.each{|line|
  ustr = NKF::nkf('--ic=UTF-8 --oc=UTF8-MAC', line)
  system ("mkdir #{ustr}")
}

nkf を使ってみました。が、最初と同じエラーが現れ ふげふが/ リファレンス/ の2のフォルダができました。

結果をみると \s のところでパスが区切られてしまったようなので
gustr = ustr.gsub(/\s/, "\\ ")
を挟んでみたものの ”&” でまたパスを区切られてしまいました。結局エラーになりそうな文字(て何?)を全て gsub しないとだめなのかもしれません。いやいやそんなことじゃなく正しい指定(nkf の)さえ分かればいいだけのことなのかもしれません。
あーわからない。

このままで話が終わるのはなんだか後味が悪いので AppleScript で Ruby を呼んでみました。

tell application "Finder"
  activate
  set cf to choose file with prompt "読み込みたいテキストファイル_UTF-8_を選択してください。"
  set dst to choose folder with prompt "保存先フォルダを選択してください。"
  set f to quoted form of POSIX path of cf
  set rubyfile to quoted form of POSIX path of (((folder of file cf) as text) & "ioread.rb")
  # ---------------------------
  try
    set str to do shell script "/usr/bin/ruby" & space & rubyfile & space & f
    set ary to paragraphs of str
    if (count of ary) > 3 then # this line
      return display dialog "体力の限界です。" buttons {"OK"} default button 1 with title "Oh, NO "
    end if
    repeat with fname in ary
      make new folder at (dst) with properties {name:fname}
    end repeat
  on error error_str
    display dialog error_str buttons {"OK"} default button 1 with title "Error"
  end try
end tell
# return AppleScript's version => "2.1.1"

% cat ioread.rb 
#!/usr/bin/ruby
f = ARGV[0]
print nil unless f
ary = IO.readlines(f)
ary.delete("\n")
print ary

% ls -F
ABC_a'bc 織田 信長/                                  ふげふが リファレンス& ドロー/
ABC_e'fg 豊臣 秀吉/


ちゃんとおかしな名前のフォルダができました。
テストなんでフォルダの数は3つまでに制限かけておきました。# this line のところ。


+++ 追記 +++
2010-02-22
しばらくしたら思いつきました。文字ごとに gsub してみようと。

% cat 02.txt

ABC_&a'bc 織田 信長
ABC_e'fg 豊臣 秀吉
ふげふが リファレンス& ドロー


test.rb

  1 #!/path/to/ruby19
  2 # coding: utf-8
  3 
  4 require 'nkf'
  5 def ex(line)
  6   mu = String.new("")
  7   ary = line.each_char{|x|
  8     gx = x.gsub(
  9       /[\s\'\(\)\+\!\&\,\[\]\;]/,
 10       " "=>"\\ ", "'"=>"\\'",
 11       "("=>"\\(", ")"=>"\\)",
 12       "+"=>"\\+", "!"=>"\\!",
 13       "&"=>"\\&", "."=>"\\.",
 14       "ï"=>"\\i", ","=>"\\,",
 15       "["=>"\\[", "]"=>"\\]",
 16       ";"=>"\\;"
 17     ) 
 18     mu << gx
 19   } 
 20   p macustr = NKF::nkf('--ic=UTF-8 --oc=UTF8-MAC', mu)
 21   p macustr.encoding
 22   system ("mkdir #{macustr}")
 23 end
 24 
 25 ARGF.each{|line| ex(line)}


% ./test.rb 02.txt

"ABC_\\&a\\'bc\\ 織田\\ 信長"
#<Encoding:UTF8-MAC>
"ABC_e\\'fg\\ 豊臣\\ 秀吉"
#<Encoding:UTF8-MAC>
"ふげふが\\ リファレンス\\&\\ ドロー"
#<Encoding:UTF8-MAC>


% ls -F

02.txt                                               test.rb*
ABC_&a'bc 織田 信長/                                 ふげふが リファレンス& ドロー/
ABC_e'fg 豊臣 秀吉/


line 10 "'" を "\\'" とスラッシュバックスラッシュ2つにしてみたらうまくいった。それがなぜなのかは分かっていない。
こういうのは力技と呼ばれることなんだろう。

UTF8-MAC [2] へ続く


[2011-02-19]

2010-02 時点での敗因はただ単にchomp しわすれとsystem コマンド発行する引数を'' で囲まなかったこと。それだけ。びっくりする愚かなおち。
nkf とかね関係ありません...。
それにしても今読み返してつくづく...単純ミスから泥沼していく様は自分でもあきれました。

% cat a.txt
ふげふが &どろー
% cat test.rb
# coding: utf-8

ARGF.each{|x|
  s =  "\'#{x.strip}\'"
  p sh = system("mkdir #{s}")
}
% ruby -v test.rb a.txt
ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
true
% ls
a.txt                            test.rb                          ふげふが &どろー


ruby 1.9.2
でも同様の結果。

0 件のコメント: