UTF-8-MACとDir#each

OS Xのファイル名の濁点問題にあたらないようにUTF-8-MAC→UTF-8しておくかなと、ふと思ったのだが、実際にRubyでワンライナー書いてやってみるとそういうファイル名のファイルがそもそも見付からなかった。(まだmacOS High Sierraにしていない。)

でもシェルの補完のときなんかにちょいちょい出てきたんだがな? と思って調べてみたところ、なんと! Ruby側で対策済みだった。

なんと! とか言っても対策が入ったのはずいぶん前のこと。2.1.0でのことだったようだ。

File.open("\x31\xe3\x81\x8b\xe3\x82\x99", "w") {}
File.open("\x32\xe3\x81\x8c", "w") {}

def t(n)
  p [n, n.length, n.bytes.map {|b| b.to_s(16) }]
end
Dir.open(".") {|d| while n = d.read; t n; end }
Dir.open(".") {|d| d.each {|n| t n } }

これを実行すると:

[".", 1, ["2e"]]
["..", 2, ["2e", "2e"]]
["1が", 3, ["31", "e3", "81", "8b", "e3", "82", "99"]]
["2が", 3, ["32", "e3", "81", "8b", "e3", "82", "99"]]
[".", 1, ["2e"]]
["..", 2, ["2e", "2e"]]
["1が", 2, ["31", "e3", "81", "8c"]]
["2が", 2, ["32", "e3", "81", "8c"]]

HFS+のとき、Dir#each、Dir.foreach、Dir.globなどはRuby内部で変換してくれる。対応はこのissue